Game Controller プログラミングガイド 目次 ゲームコントローラについて 5 はじめに 5 コントローラが必須であってはならない 6 コントローラを検出したら自動的に接続する 6 プロファイルはコントロール要素(ハードウェア)を必要なデータ(ソフトウェア)に対応づけ る 7 スナップショットとしてコントローラのデータを記録する 8 この文書の使い方 8 必要事項 8 関連項目 9 コントローラをゲームに取り込む 10 入力をゲームに提供する 10 Appleがサポートするコントローラを理解する 12 コントローラには標準型と拡張型のコントロール要素の配置がある 12 コントローラはスタンドアロン型か組み込み型のいずれかである 12 コントローラは無線で通信するか直接接続する 13 Appleが定義するコントローラ 13 ゲームコントローラをサポートするゲームの要件 16 ゲームのアクションをコントロール要素にマッピングする 17 AボタンとBボタンをよく使うアクションに割り当てる 17 主要なアクションにトリガやショルダーボタンを使う 18 方向パッドまたは左側の親指スティックを使用して移動を制御する 18 右側の親指スティックをオプションのアクションに使う 18 プレーヤーの負担を増やしすぎない 19 プレーヤーになじみのあるコントロール要素の配置を使う 19 ゲーム内のコントロール要素を説明する 21 コントローラを使って優れたユーザ体験を構築する 22 コントローラの検出と接続 25 無線型のコントローラを検出する 25 接続されたコントローラを検出する 26 コントローラオブジェクトを使用する 27 プレーヤーの番号(インデックス)によりコントローラを識別する 27 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 2 目次 コントローラの要素を処理する 28 コントローラプロファイルを使ってコントロール値とその解釈方法を対応づける 28 要素の値を直接読み取る 30 要素の状態が変化したときに呼び出されるよう登録する 31 スナップショットを使ってコントローラ入力を直列化する 32 推奨される特定の要素の型 33 tvOSの制御入力 34 コントローラの制約 34 Apple TVリモコンをゲームコントローラとして使う 34 コントローラ入力の配送先を決める 35 コントローラを追加する際のチェックリスト 37 iOSのチェックリスト 37 iOSの要件 37 iOSの推奨事項 38 tvOSのチェックリスト 38 tvOSの要件 38 tvOSの推奨事項 38 OS Xのチェックリスト 39 OS Xの要件 39 OS Xの推奨事項 39 書類の改訂履歴 41 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 3 図、表、リスト コントローラをゲームに取り込む 10 図 1-1 図 1-2 図 1-3 図 1-4 表 1-1 表 1-2 表 1-3 表 1-4 表 1-5 組み込み標準型コントローラ 13 組み込み拡張型コントローラ 14 スタンドアロン拡張型のゲームコントローラ 15 Apple TVリモコン 16 フライトシミュレーターのコントロール要素の配置の例 20 アクションゲームのコントロール要素の配置の例 20 レースゲームのコントロール要素の配置の例 20 標準型の配置でのコントロール要素の名前 21 拡張型の配置でのコントロール要素の名前 21 コントローラの要素を処理する 28 表 3-1 表 3-2 リスト 3-1 リスト 3-2 リスト 3-3 ゲームコントローラのプロファイル 28 ゲームコントローラの要素の型 29 プロファイルの要素をポーリングするコード例 30 プロファイルの状態変化に応じて呼び出される、ハンドラを登録するコード例 31 要素に対して個別にハンドラを登録するコード例 32 tvOSの制御入力 34 図 4-1 コントローラ入力の配送先 35 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 4 ゲームコントローラについて ゲームコントローラは、ゲームでアクションをトリガする物理コントロール要素を提供します。Apple はMFiアクセサリのメーカーにコントロール要素の外観と動作を指定しているため、あらゆるゲーム コントローラで高品質なコントロール要素を利用できます。ゲームでGame Controllerフレームワーク をサポートすることで、こうしたゲームコントローラをすべてサポートできます。 はじめに Game Controllerフレームワークにより、MacやiOSデバイス、Apple TVに接続されたコントローラを容 易に検出できます。ゲームがコントローラを検出して構成し、その後はゲームの進行に応じて、コン トロール入力を読み取ることができます。 Game Controllerフレームワークがサポートするデバイスは、次の3つの点で明確に区別することがで きます。 ● ● ● デバイスごとにさまざまなコントロール部品のレイアウトがあります。 デバイスは、スタンドアロン型コントローラ、またはiOSデバイスに直接接続するコントローラの いずれかに分けることができます。後者の場合、タッチスクリーンとモーションセンサーをアプ リケーションで利用できます。 コントローラデバイスを直接デバイスに接続することも、無線で接続することもできます。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 5 ゲームコントローラについて はじめに コントローラが必須であってはならない コントローラはゲームの楽しさを増やすためのものですが、ゲームを購入する人が全員コントローラ を購入するわけではありません。このため、ゲームの中でゲームコントローラの使用を必須にしない でください。コントローラが利用できない場合は、ゲームで別のコントロール要素を提供する必要が あります。 ● iOSのゲームをデザインする場合、タッチスクリーンと統合されたセンサーを使用します。さら に、ゲームコントローラをサポートする場合は、拡張型のコントロール要素の配置を使う必要は ありませんが、可能な場合に拡張型のコントロール要素を利用することができます。 ● Macのゲームをデザインする場合、キーボードとマウスを使用します。スタンドアロン型コント ローラは、すべて拡張型のコントロール要素の配置を提供するため、アプリケーションは常に拡 張型のコントロール要素の配置を使用できます。 ● tvOS用のゲームを設計する際には、Apple TVリモコンが使えるようにしてください。UIKitははじ めからApple TVリモコンに対応していますが、Game Controllerフレームワークを使って、リモコ ンから直接、低レベル入力を読み取ることも可能です。 関連する章: “コントローラをゲームに取り込む” (10 ページ) コントローラを検出したら自動的に接続する コントローラがLightningコネクタを使用してiOSデバイスに直接接続されると、Game Controllerフレー ムワークによって自動的に検出され、ゲームで利用できるようになります。コントローラをiOSデバ イス、Apple TV、Macに無線で接続することも可能ですが、その動作は若干異なります。すなわち、 無線コントローラはあらかじめペアリングしておかないと、ゲームがこれを検出できません。ペアリ ング処理は通常、オペレーティングシステム側がおこないます(「Preferences」や「Settings」で設 定)が、Game Controllerフレームワークを使って、ゲーム内でペアリングすることも可能です。検出 プロセス中、ゲーム画面に独自のユーザインターフェイスを表示して、ゲームの進行を一時停止して ください。ペアリングは1度だけ実行する必要があります。ペアリング後、ゲームコントローラをオ ンにすれば自動的に接続され、ゲームを実行できるようになります。 ゲームで接続されているコントローラを確認したり、コントローラの接続や切断が行われたときに通 知で知らせるようにしたりできます。ほとんどのゲームで、プレーヤーに適切なゲーム内の体験を提 供できるように通知を使うのが一般的になっています。コントローラが接続されると、通知のコント ローラオブジェクトを使用して、物理コントローラを表すオブジェクトを取得します。コントローラ が切断されると、通常はゲームを一時停止して、デフォルトのコントロール要素に切り替えます。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 6 ゲームコントローラについて はじめに 関連する章: “コントローラの検出と接続” (25 ページ) プロファイルはコントロール要素(ハードウェア)を必要なデータ(ソフ トウェア)に対応づける コントローラのサポートをゲームに追加する場合、プレーヤーがゲームコントローラをどのように操 作してゲームを進めるのかに焦点を当てます。組み込み型コントローラを使用し、iOSデバイスでゲー ムを進めている場合は、プレーヤーがタッチスクリーンとモーションセンサーも利用できるようにす べきか決定します。ゲームがスタンドアロン型コントローラを使用してプレイされている場合、これ らのオプションは利用できません。つまり、利用可能な機能によっては、ゲームを進める方法を複数 デザインしなければならない可能性があります。最良の結果を得るためには、複数のコントローラで テストする必要があります。 コントロール要素の配置はAppleにより定義されていますが、デバイスが異なる場合、小型化された スタイルになる可能性があります。たとえば、大人用にデザインされたコントローラは、子どもの小 さな手に合わせてデザインされたものとは異なります。実際の配置では、これらの小さな違いは心配 する必要がありません。代わりに、Game Controllerフレームワークが提供するコントロール要素のプ ロファイルの1つをサポートすることに集中してください。コントローラのプロファイルとして次の ようなものがあります。 ● Gamepadプロファイル ● Extended Gamepadプロファイル ● Motionプロファイル さらにtvOSの場合、Apple TVリモコンは特別なMicro Gamepadプロファイルを使います。 各プロファイルには、コントローラで利用できることが保証された物理コントロール要素の集合があ らかじめ定義されています。同じコントローラ(ハードウェア)が複数のプロファイルをサポートする こともあります。たとえば、Extended Gamepadプロファイルをサポートするコントローラは、Gamepad Profileもサポートする必要があります。Game Controllerフレームワークは、コントローラが備えるハー ドウェアのコントロール要素を、プロファイルに定義されたソフトウェアのコントロール要素に対応 づけます。 コントローラのプロファイルが作成されたら、コントロール要素をポーリングするか、コントロール 要素がプレーヤーによって操作されたときに呼び出されるブロックを登録できます。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 7 ゲームコントローラについて この文書の使い方 関連する章: “コントローラをゲームに取り込む” (10 ページ)、“コントローラの要素を処 理する” (28 ページ) スナップショットとしてコントローラのデータを記録する コントローラのプロファイルが作成されたら、コントロール要素のスナップショットを収集できま す。収集されたスナップショットは、スナップショットが作成された時点におけるコントロール要素 の状態を完全な形で表すものです。通常、複数の要素が同時に状態を変更しているかどうかを確認し たいときに、スナップショットを作成します。ただし、スナップショットはいつでも作成して、後で 使うことが可能です。たとえば次の場合にスナップショットを使うことができます。 ● 複数の実行スレッドにまたがってコントローラの状態を同期する ● ネットワーク経由でコントローラの状態を送信する ● コントローラの状態をファイルに保存する スナップショットは、実際にはプロファイルオブジェクトであるため、コントローラの値を後で読み 取った場合、物理コントローラから入力を読み取っているのと同じように機能します。 関連する章: “コントローラの要素を処理する” (28 ページ) この文書の使い方 第1章の“コントローラをゲームに取り込む” (10 ページ)では、Game Controllerフレームワークによ りサポートされるコントローラについて説明します。ゲームコントローラをサポートするゲームの要 件について詳細に説明し、ゲームコントローラのコントロール要素に対するアクションの関連付けの ガイダンスを提供します。次の2つの章では、コントローラの検出、構成、および入力の処理方法に ついて説明します。最後の章の「コントローラを追加する際のチェックリスト」 ($@ ページ)で は、ゲームでコントローラのサポートを実装するための要件と提案についてまとめています。 必要事項 ゲームコントローラを使うゲームの開発に先立ち、ブロックについて理解しておいてください。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 8 ゲームコントローラについて 関連項目 関連項目 Game Controllerフレームワークのクラスに関する詳細な説明は、『GameControllerFrameworkReference 』 を参照してください。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 9 コントローラをゲームに取り込む ゲームコントローラを使えば、これまでになかった方法でゲームを操作できるようになります。ゲー ムをデザインするとき、コントローラが適切かどうかを決めるのは開発者に任せられており、適切だ と判断した場合は、ゲームでの使用方法も決めることができます。プレーヤーがコントローラを持っ ている場合、そのコントローラをゲームへのデータ入力の唯一の手段として扱うか、多数の入力手段 の1つにすぎないものとして扱うかを決定することができます。後者の場合では、コントロール要素 がタッチスクリーンやモーションセンサーなど、ほかのセンサーからのデータと共に使用され、それ ぞれの種類の入力の長所に基づく体験が生み出されます。このため、ゲームで優れたユーザ体験を生 み出すには、コントローラ、コントローラが提供する入力データの種類、プレーヤーがコントロール 要素を使用する方法を理解する必要があります。それらを理解した場合にのみ、ゲームでコントロー ラを使う最適な法を理解することができます。 この章では次のような事項を説明します。 ● ゲームコントローラのコントロール要素とほかの種類の入力との比較 ● Made for iPhone/iPod/iPad(MFi)プログラムによりサポートされるゲームコントローラの特徴 ● ゲームコントローラのサポートを実装するゲームに関するAppleの要件 ● ゲームの操作をコントローラのコントロール要素にマップする方法 ● コントローラの特定のコントロール要素を参照する方法 ● ゲームコントローラがゲームの体験を高めるために実行できる特定の操作 入力をゲームに提供する 操作 はゲームの進行に必須の重要な部分です。プレーヤーはゲームが提供する知覚情報(グラフィッ クス、オーディオ)を絶えず解釈します。このデータから、プレーヤーは実行する操作を選択します。 次に、プレーヤーは計画を実行するための入力データをゲームに提供します。こうした意思決定の ループ(観察、状況判断、決定、実行)は、ゲームが終了するまで継続的に行われます。アクションゲー ムでは、プレーヤーがどのように行動するかを判断している間もゲームが止まることはないため、こ の意思決定のループがとてもすばやく行われます。時間が自動的に経過しないゲームでは、プレー ヤーはもっと慎重に行動できる場合があります。ただし、どのようなゲームでも、プレーヤーは何を するか決定し、決定したことを試します。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 10 コントローラをゲームに取り込む 入力をゲームに提供する ゲームをデザインするとき、プレーヤーがゲームの操作に使う可能性がある様々な方法を評価し、適 切な入力方法を選択することをお勧めします。ゲームのコントロール要素は、プレーヤーが自然に感 じるものでなければなりません。プレーヤーはゲームに挑戦を挑まれているように感じるべきです が、ゲームのコントロール要素 に挑戦を挑まれているように感じたり、いらいらしたりするべきでは ありません。ゲームコントローラは、利用可能な入力の種類を増やすものです。コントローラに加え て、ゲームで利用できる入力データがほかにもあります。以下に例を示します。 タッチインターフェイス。iOSデバイスの画面は、プレーヤーの指先からタッチ入力を受け取ります。 タッチ入力は、プレーヤーが画面上の対象を自然に操作できる方法ですが、正確さに欠けることがよ くあります。プレーヤーはある程度小さな領域はすばやく選択できますが、ピクセルサイズの領域を 正確に選択することはできません。また、タッチしている対象の触覚フィードバックがないため、直 接表示されない対象を操作することが困難です。たとえば、過去にiOSのゲームが、画面に親指ス ティックの画像を描画して、親指スティックをシミュレーションしていました。これらの仮想コント ロール要素は、実際の親指スティックのようには動作しません。なぜなら、プレーヤーは親指スティッ クと画面上のほかの要素に同時に細心の注意を払うことができないからです。 モーション。プレーヤーがデバイス全体を操作し、加速度センサーとジャイロシステムが入力データ をゲームに提供します。タッチインターフェイスと同様、モーションコントロール要素も非常に直感 的に利用できます。しかし、画面がデバイスに合わせて移動するため、画面の画像が常に動きます。 マウス。プレーヤーはマウスまたはトラックパッドを操作して、カーソルを移動します。代わりに、 マウスの移動をデルタとして解釈し、ゲームのカメラを回転または移動することができます。マウス ベースのインターフェイスは間接的ですが、ピクセルレベルの正確さを提供できます。 キーボード。キーボードは、ゲームのアクションに直接マップできる、個別のキー入力を提供しま す。キーボードは明確なコントロール領域と触覚フィードバックを提供します。 Appleがサポートするゲームコントローラでは、2つのオプションが追加されます。 アナログボタンとトリガ。ボタンとトリガは、ゲームの特定のアクションにマップできる触覚コント ロール要素を提供します。プレーヤーがボタンを押すと、アクションがトリガされます。MFiゲーム コントローラのすべてのボタンとトリガは、圧力を検知します。一定の強さの圧力をボタンにかけて ボタンを動かすと、かかった圧力をボタンが測定します。このため、ゲームはボタンが押されたかど うかを判断したり(個別のコントロール要素)、ボタンにかけられた圧力を判断したり(アナログ)できま す。 アナログの親指スティックとアナログの方向パッド。親指スティックと方向パッドは、ニュートラル なデフォルトの位置に相対的な2つの軸の動きを提供します。ボタンと同様に、親指スティックと方 向パッドはアナログのコントロール要素で、コントロール要素がニュートラルな位置から移動した距 離を測定します。プレーヤーが親指スティックまたは方向パッドから手を離すと、すぐにニュートラ ルな位置に戻ります。デッドゾーンの計算は、Game Controllerフレームワークにより自動的に実行さ れるため、ゲームでこの作業をする必要はありません。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 11 コントローラをゲームに取り込む Appleがサポートするコントローラを理解する Appleがサポートするコントローラを理解する Appleは、主な種類のMFiゲームコントローラの仕様を作成しました。実際のコントローラは変わる可 能性がありますが、共通する特徴の多くは仕様に厳密に従って実装する必要があります。 コントローラには標準型と拡張型のコントロール要素の配置がある コントローラはすべて、標準型のコントロール要素の配置と拡張型のコントロール要素の配置のいず れかを使用します。標準型のコントロール要素の配置 は、次のコントロール要素を提供します。 ● コントローラの右側にひし形に配置された4つのアナログボタン(A、B、X、Yのラベルあり) ● コントローラの左側にあるアナログの方向パッド ● 2つアナログのショルダーボタン(L、Rのラベルあり) ● ゲームの進行を一時停止してから再開するためのボタン 拡張型のコントロール要素の配置 は、標準型のコントロール要素の配置を含んでいます。 ● コントローラの右側にひし形に配置された4つのアナログボタン(A、B、X、Yのラベルあり) ● コントローラの左側にあるアナログの方向パッド ● コントローラの左右に1つずつあるアナログの親指スティック ● 2つアナログのショルダーボタン(L1、R1のラベルあり) ● 2つアナログのトリガ(L2、R2のラベルあり) ● ゲームの進行を一時停止してから再開するためのボタン さらにApple TV Remoteには、独自のマイクロコントロールレイアウト があります。 ● リモコン上部にアナログの方向パッド ● 2つのデジタルボタン(A、X) ● ゲームの進行を一時停止/再開するためのボタン コントローラはスタンドアロン型か組み込み型のいずれかである スタンドアロン型コントローラ は、MacまたはiOSデバイスとは別のデバイスです。プレーヤーがス タンドアロン型コントローラでゲームを進める場合、コントローラはプレーヤーが簡単に操作できる 唯一のデバイスとなります。通常、ほかのコントロール要素にアクセスすることはできません。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 12 コントローラをゲームに取り込む Appleがサポートするコントローラを理解する 組み込み型コントローラ は、iOSデバイスと共に使用する場合にのみ動作するよう設計されます(ま た、通常は特定のデバイスまたは似た種類のデバイスで動作するよう設計されます)。iOSデバイスが、 コントローラの中に常に横向きで配置されます。プレーヤーは、タッチスクリーンとモーションのコ ントロール要素を利用できます。 コントローラは無線で通信するか直接接続する 無線型のコントローラは、明示的にデバイスにペアリングされるまで、デバイスに表示されません。 通常は、プレーヤーが「Bluetooth」設定からコントローラを検出してペアリングします。ただし、 ゲームが直接このサポートを提供することもできます。“無線型のコントローラを検出する” (25 ペー ジ)を参照してください。 Lightningコネクタを使用してiOSデバイスに直接接続されているコントローラは、接続するとすぐに 自動で検出されます。 Appleが定義するコントローラ Appleは、組み込み標準型、組み込み拡張型、スタンドアロン拡張型という、3つの主なカテゴリをコ ントローラに定義しています。 iOSの組み込み標準型コントローラ 組み込み標準型コントローラは、標準型のコントロール要素の配置をサポートします。図 1-2は、 iPhoneに取り付けられた標準型コントローラにおけるコントロール要素の配置を示しています。 図 1-1 組み込み標準型コントローラ 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 13 コントローラをゲームに取り込む Appleがサポートするコントローラを理解する iOSの組み込み拡張型コントローラ 組み込み拡張型コントローラは、拡張されたコントロール要素の配置をサポートします。図 1-2は、 iPhoneに取り付けられた標準型コントローラにおけるコントロール要素の配置を示しています。 図 1-2 組み込み拡張型コントローラ 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 14 コントローラをゲームに取り込む Appleがサポートするコントローラを理解する スタンドアロン拡張型コントローラ スタンドアロン拡張型コントローラは、拡張されたコントロール要素の配置をサポートします。図 1-3は、そのようなコントローラの図です。 図 1-3 スタンドアロン拡張型のゲームコントローラ 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 15 コントローラをゲームに取り込む ゲームコントローラをサポートするゲームの要件 Apple TVリモコン Apple TVはマイクロコントロールレイアウトに対応しています。図 1-3にリモコンの外観を示します。 ゲームコントローラとして用いる場合、タッチ面(1)が方向パッドになります。ここを下に押せば ボタン代わりになります。「再生/一時停止」ボタン(4)は第2ボタンとして働き、ゲームの一時停 止/再開には「Menu」ボタン(2)を使います。Apple TVリモコンはMotionプロファイルにも一部対応 しています。 図 1-4 Apple TVリモコン ゲームコントローラをサポートするゲームの要件 Appleは、ゲームコントローラをサポートするゲームで従うべき固有の要件を作成しています。これ らの要件は、ゲームをいつでも楽しめるようにするためのものです。 コントローラ以外の選択肢をサポートする必要があります。ゲームでコントローラの使用が必須では ないようにします。プレーヤーがコントローラを持っていない場合は、代わりのインターフェイスを 提供する必要があります。たとえば、iOSのゲームでは、モーションベースのセンサーを使ったり、 コントローラが利用できない場合にのみ表示される仮想コントロール要素を使ったりすることができ ます。tvOS用のゲームは、Apple TVリモコンも使えるようにする必要があります。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 16 コントローラをゲームに取り込む ゲームのアクションをコントロール要素にマッピングする コントローラをサポートするiOSのゲームは、標準型のコントロール要素の配置をサポートしている 必要があります。iOSのゲームでは、拡張型のコントロール要素の配置の使用が必須 となることはあ りませんが、可能な場合はサポート することができます。標準型コントローラを使用してゲームを進 める場合、これらのゲームのアクションにほかの方法でもアクセスできなければなりません。たとえ ば、標準型コントローラは、すべて組み込み型であることが保証されているので、モーションセン サーを使用して、動きの情報を提供することができます。 MacやApple TVでは組み込み型コントローラを使わないので、コントローラをサポートする際、標準 型のコントロール要素の配置に対応する必要はありません。 ゲームはスタンドアロン型コントローラを使用して進めることができなければなりません。拡張型コ ントローラをサポートしている場合、コントローラがデバイスに物理的に接続されない可能性があり ます。つまり、プレーヤーがデバイスとコントローラを同時に操作するのが簡単でないことがありま す。ゲームの進行の主要な部分は、コントローラから完全にアクセスできる必要があります。また、 メニューなどのほかのインターフェイスも、コントローラからアクセスできる必要があります。 一時停止ボタンをサポートする必要があります。コントローラはすべて一時停止ボタンを備えていま す。ゲームが進行しているときに、一時停止ボタンを押すと、ゲームの一時停止と再開が切り替わら なければなりません。ゲームが進行していないとき(メニュー画面が現れているなど)は、一時停止 ボタンを無視するか、メニューボタンとして扱い、前の画面に戻ってください(これは特にtvOSでは 普通の挙動)。 ゲームのアクションをコントロール要素にマッピングする ゲームデザインの一部として、どのコントロール要素がゲームに役立つのかを決定し、プレーヤーが 実行できる様々なアクションにコントロール要素をマッピングできるようにします。ゲームのデザイ ンだけでなく、コントロール要素の実際の配置も考慮してください。プレーヤーは、同時にすべての コントロール要素に手が届くわけではないので、ゲームを進めているときに、プレーヤーがコント ロール要素をどのように操作するのかを考慮する必要があります。このため、コントロール要素の配 置を作成して実際のハードウェアのコントローラでテストし、実際に機能することを確認します。 AボタンとBボタンをよく使うアクションに割り当てる ひし形に配置されたAボタンとBボタンは、プレーヤーがアクセスしやすい場所であるため、多くの場 合、よく使うアクションをこれらに配置します。慣例的に、Aボタンはアクションを有効にしたりア クティブにしたりするのに使用され、Bボタンはそれらのアクションを取り消したり元に戻したりし ます。たとえば、ゲームのメニューのサポートを実装するには、方向パッドを使用して項目を選択 し、Aボタンを使用してその項目に関連付けられたアクションを実行します。Bボタンは選択を取り消 します(プレーヤーがオプションの階層を移動している場合は、フォーカスを前のメニューに移動す る場合があります)。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 17 コントローラをゲームに取り込む ゲームのアクションをコントロール要素にマッピングする 主要なアクションにトリガやショルダーボタンを使う トリガとショルダーボタンは、重要なアクションで使用するのが自然なコントロール要素です。なぜ なら、プレーヤーはこれらのコントロール要素を人差し指で動かしながら、親指を使って親指スティッ ク、方向パッド、ひし形に配置されたボタンを操作するからです。 方向パッドまたは左側の親指スティックを使用して移動を制御する 移動の制御に左側の親指スティックを使用している場合、プレーヤーは左の親指で移動のすべての側 面を簡単に管理でき、ほかの指はほかのコントロール要素が操作できる状態になっています。方向 パッドは移動の制御に使用できますが、別の操作を割り当てることもできます。拡張型コントローラ では、親指スティックを使って移動を制御し、方向パッドを使ってほかのアクションを行います。 親指スティックと方向パッドで、両方の軸にアクションを割り当てる場合は注意が必要です。これら の軸に関連するアクションは、お互いが密接に関連するものか、別々に選択されるアクションにする 必要があります。一方の軸があるアクションを制御しているとき、同時にもう一方の軸を別のアク ションに割り当てることは避けてください。そのようにすると、コントロール要素が不必要に難しく なります。以下に例を示します。 ● ● ● ● 移動のアクションが関連する場合は、両方の軸を使用してください。 たとえば、ファーストパー ソンゲームは、前後の移動に垂直軸を使用し、左右の移動に水平軸を使用することがよくありま す。同様に、飛行機を制御するとき、ピッチの制御に垂直軸を使い、飛行機を傾斜させるときに 水平軸を使います。どちらの場合も、移動という同じアクションを行っているので、コントロー ル要素の役割を簡単に把握できます。 方向パッドの両方の軸が個別のアクションの選択に使用されている場合は、両方の軸を使用して ください 。基本方向(上下左右)を使用して、4つの個別のアクションを作成します。また、2つの 軸からのボタンの値を結合して、斜めのアクション(左上、右上、左下、右下)を作成することも できます。 水平軸にステアリングの動作を割り当て、垂直軸にアクセルの動作を割り当てることは、これら の動作が非常に異なったものであるため、行わないでください。 代わりに、アクセルとブレーキ をショルダーボタンまたはトリガに移動します。 1つの軸を移動の制御、もう1つの軸を別のアクション(ジャンプする、しゃがむなど)に使わない でください。 右側の親指スティックをオプションのアクションに使う 右側の親指スティックは、ひし形に配置されたボタンと同時に使うことが難しい場合があります。こ のため、通常右側の親指スティックは、プレーヤーが親指スティックから手を離すことができるアク ションに結び付けます。たとえば、フライトシミュレーターで、プレーヤーが周囲を見まわすときに 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 18 コントローラをゲームに取り込む プレーヤーになじみのあるコントロール要素の配置を使う 右側の親指スティックを使用する場合があります。プレーヤーがほかのコントロール要素を一時的に 使用しなければならない場合、親指スティックは元の位置に戻り、プレーヤーは正面を向くことにな ります。 プレーヤーの負担を増やしすぎない プレーヤーはコントローラ上のすべてのコントロール要素を同時に操作することはできません。この ため、プレーヤーが直感的に切り替えやすい配置に利用可能なコントロール要素をデザインします。 コントロール要素の配置を適切にデザインするには、コントロール要素の配置を、プレーヤーが実際 のハードウェアを使ってテストします。プレーヤーがゲームを苦労せずに直感的に制御できない場合 は、コントロール要素の配置を変更する必要があります。コントロール要素の配置をテストする場 合、次の一般的なガイドラインを考慮してください。 ● ● ● ● プレーヤーが指先を動かしてコントロール要素を操作する様子を観察します。同時に使用できる ようにしなければならないコントロール要素は、ほぼ常に別の指でも制御できるようにする必要 があります。 A、B、X、およびYの各ボタンを組み合わせて押すことで、新しい別のアクションを作成すること ができます。たとえばAとB、XとY、または4つのボタンすべてを組み合わせて同時に押すことが できます。ただし、3つのボタンを同時に押すのは困難です。また、通常別の指で操作されるコ ントロール要素であるため、ひし形に配置されたボタンと、ショルダーボタンまたはトリガの1 つの組み合わせも検討できます。 ショルダーボタンを押しながら、コントローラの同じ側にあるトリガを引くのは難しい可能性が あります。 ゲームがタッチスクリーンのコントロール要素とコントローラの入力の両方を使用している場 合、プレーヤーは画面にタッチするために、親指などの指先をコントローラから離さなければな らないことがあります。プレーヤーが画面のタッチとコントローラの使用を急いで切り替える必 要があるアクションは、連続しないようにしてください。 プレーヤーになじみのあるコントロール要素の配置を使う ゲームのコントロール要素の配置を検討する場合、3つの標準的な配置があります。ゲームがフライ トシミュレーター、アクションゲーム、レースゲームの場合、プレーヤーが慣れた配置が既に存在す るため、次のコントロール要素の配置にできるだけ近づける必要があります。 表 1-2は、フライトシミュレータのコントロール要素を示しています。左手は飛行機の飛行、右手は ほかのほとんどのアクションを行うのに使っています。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 19 コントローラをゲームに取り込む プレーヤーになじみのあるコントロール要素の配置を使う 表 1-1 フライトシミュレーターのコントロール要素の配置の例 コントロール要素 アクション 左の親指スティックまた方向パッド フライトの制御 Aボタン アフターバーナー Bボタン スピードブレーキ 右トリガ(R2) ガンを発射 左トリガ(L2) ミサイルを発射 表 1-2は、アクションゲームのコントロール要素を示しています。 表 1-2 アクションゲームのコントロール要素の配置の例 コントロール要素 アクション 左の親指スティックまた方向パッド 動き AボタンまたはBボタン ジャンプ XボタンまたはYボタン ダッシュまたはアイテムを使用 左ショルダーまたは右ショルダー しゃがむ 表 1-3は、レースゲームの標準的なコントロール要素を示しています。この例では、複数のコントロー ル要素が同じアクションに割り当てられ、プレーヤーが好きなコントロール要素を選択できるように なっています。また、この配置は、方向パッドの垂直軸に混乱するコントロール要素を追加しないよ うにしています。 表 1-3 レースゲームのコントロール要素の配置の例 コントロール要素 アクション 左の親指スティックまた方向パッド(水平軸) ステアリング Aボタン アクセル XボタンまたはBボタン ブレーキ 右トリガ(R2)またはショルダー アクセル 左トリガまたはショルダー ブレーキ 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 20 コントローラをゲームに取り込む ゲーム内のコントロール要素を説明する コントロール要素 アクション Yボタン アイテムを使用 ゲーム内のコントロール要素を説明する ゲームでコントローラのサポートを実装する場合、それらのコントロール要素を必ずプレーヤーに説 明してください。コントロール要素が何に使用されているか、プレーヤーがいつでも確認できるよう にしてください。たとえば、プレーヤーにゲームの遊び方を教えるチュートリアルを実装したり、コ ントロール要素を説明するコンテンツの画面を組み込んだりするとよいでしょう。すべてのコント ローラは、標準型または拡張型のコントロール要素のどちらをサポートしているかに基づき、一貫性 のあるラベルが付いています。コントロール要素を参照する場合、このラベルの表記を使用し、どの ゲームを進めていても、常に同じコントロール要素の名前がプレーヤーに表示されるようにしてくだ さい。 表 1-4は、標準型コントローラのコントロール要素の名前を示しています。 表 1-4 標準型の配置でのコントロール要素の名前 コントロール要素の名前 略語 Aボタン A Bボタン B Xボタン X Yボタン Y 方向パッド Dパッド 左ショルダーボタン L 右ショルダーボタン R 表 1-5は、拡張型コントローラのコントロール要素の名前を示しています。 表 1-5 拡張型の配置でのコントロール要素の名前 コントロール要素の名前 略語 Aボタン A Bボタン B 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 21 コントローラをゲームに取り込む コントローラを使って優れたユーザ体験を構築する コントロール要素の名前 略語 Xボタン X Yボタン Y 方向パッド Dパッド 左ショルダーボタン L1 右ショルダーボタン R1 左トリガ L2 右トリガ R2 左親指スティック L親指スティック 右親指スティック R親指スティック Important: ひし形に配置された4つのボタンは、A (赤)、B (緑)、X (黄)、Y (青) という常に同じ4色 を使用しています。このため、ひし形に配置されたボタンを指すときに、色を使うこともできま す。 コントローラを使って優れたユーザ体験を構築する コントローラを適切に実装すると、コントロール要素よりもプレーヤーが利用できるオプションが広 がり、ゲームの進行に利用できる画面のスペースが増えるため、素晴らしいユーザ体験を提供するこ とができます。ただし、コントローラを使ってゲームを適切に進められるようにするには、必要な作 業がもう少しあります。優れたコントロール要素の配置を組み立てることは、このプロセスの第一歩 です。ゲームを公開するとき、ほかに次のガイドラインとヒントを考慮してください。 ● ● 組み込み型コントローラでは、常にiOSデバイスを横向きにして持ちます。iOSデバイスが組み込 み型コントローラに取り付けられている場合、向きを変えるのは不自然です。組み込み型コント ローラを使っている間は横向きに固定してください。 コントローラがデバイスに接続されている場合、画面から重複するコントロール要素を削除しま す。ゲームの画面上で、でボタンや仮想の親指スティックなどのコントロール要素を作成してい る場合、コントローラを接続したら、これらのコントロール要素を非表示にしてください。これ らは必要なくなり、プレーヤーの邪魔になる可能性があります。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 22 コントローラをゲームに取り込む コントローラを使って優れたユーザ体験を構築する ● ● ゲームが画面の操作を必要としない場合は、画面がスリープ状態にならないようにします。iOS/tvOS アプリケーションでは、UIApplicationオブジェクトのidleTimerDisabledプロパティを使用し て、画面がスリープ状態にならないようにできます。 一時停止ボタンをサポートします。一時停止ボタンは、必ずサポートしてください。プレーヤー がスタンドアロン型コントローラを使用している場合、一時停止ボタンは、ゲームの進行の一時 停止と再開を切り替える最も便利な方法です。一時停止ボタンを押すごとに、動作状態と一時停 止状態が切り替わる必要があります。 Game Controllerフレームワークでは、一時停止ボタンを押したことが視覚的に示されないので、 ゲームが一時停止されたことを示すのに、視覚的な手がかりを使うか、オーディオの手がかりを 使うか、または両方を使うかを、開発者が決定できます。ゲームが再開されるまで、ゲームが一 時停止され、一時停止ボタンを押すと再開できることを示す情報を画面に表示します。また、 ゲームの進行以外の、副次的な動作を表示することもできます。たとえば、ゲーム内の別のアク ティビティをプレーヤーが選択できるメニューを画面に表示することもできます。基本的に、一 時停止することで、通常のゲームの進行を停止し、プレーヤーに表示したい副次的な動作を表示 することができます。アプリケーション(およびコントローラのすべての入力)は、アクティブな ままです。プレーヤーはコントローラを使用して、この副次的な動作を操作することができなけ ればなりません。 マルチプレーヤーゲームなど、ゲームの進行を完全に一時停止できない場合は、適用可能な部分 を一時停止し、残りは引き続き実行させます。ゲームが進行中でも、そのゲーム内ではコント ローラの入力が無視されます。入力は画面のメニューを制御するものにし、それ以外は無視する ようにします。 一時停止と再開の動作を、必ずアプリケーションのほかのイベントと調整してください。たとえ ば、ゲームがバックグラウンド状態に移行する場合、ゲームは通常一時停止されます。ゲームが 再びフォアグラウンド状態に戻ったとき、プレーヤーが再開を選択するまで、ゲームは一時停止 されたままになります。ただし、これらの動作をコントローラと統合することで、元はゲームの 一時停止に使われていない場合でも、一時停止ボタンでゲームを再開することができます。 ● ● プロファイルに明示されているコントロール類には、ゲームの何らかの機能を与えてください。 たとえばAボタンしか使わないゲームでも、B、X、Yを使わないままにしてはなりません。4つの ボタンすべてに同じアクションを割り当てるとよいでしょう。 コントローラの接続または切断に応じて反応します。プレーヤーにとって直感的なアプローチを 選択します。たとえば、ゲームを進めているときに、コントローラがゲームに接続された場合、 プレーヤーはコントローラを使いたいものと想定し、コントローラのコントロール要素に切り替 えます。同様に、2つのコントローラが接続されている場合は、スタンドアロン型コントローラ ではなく、組み込み型コントローラを優先します。 プレーヤーがコントローラを切断した場合は、慎重に対応します。間違って切断されたものと想 定し、即座にゲームを一時停止します。プレーヤーがデバイスからゲームを再開した場合は、 ゲームコントローラを使用しないときのコントロール要素の配置に切り替えます。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 23 コントローラをゲームに取り込む コントローラを使って優れたユーザ体験を構築する ● ● コントローラの使用をできる限りサポートします。プレーヤーがスタンドアロン型コントローラ を使用している場合、プレーヤーは画面に手が届かないため、画面にタッチできないと想定しま す。メニューやその他のゲームのアクションが、必ずゲームコントローラを使ってアクティブ化 できるようにします。 必要に応じて、プレーヤーがボタンから手を離し、再び押す操作を要求します。ボタンが押され ていることを受け入れる前に、プレーヤーにボタンから手を離すことを求める場合があります。 たとえば、コントローラを使用するメニューのサポートを実装し、すべてのアクションで同じボ タン(A)を使っている場合、プレーヤーがボタンから手を離す前に、複数のメニューを選択してし まうことがあります。代わりに、各アクションをトリガする前に、ボタンから手を離すことをプ レーヤーに要求します。(ゲームの進行中にメニューを表示している場合は、メニューが表示され たときに、プレーヤーが既にボタンを押している可能性があります。) 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 24 コントローラの検出と接続 ゲームでは、物理コントローラをGCControllerオブジェクトで表します。コントローラが接続され ると、Game Controllerフレームワークによってオブジェクトが自動的に作成されます。開発者はこの オブジェクトを使用してコントローラを構成し、入力を読み取ります。 この章では、以下のトピックについて学習します。 ● ゲームでユーザがペアリングされていない無線型のコントローラを検出できるようにする ● 接続されたコントローラのオブジェクトを取得するGCController ● 接続されたコントローラを構成する 無線型のコントローラを検出する 無線型のコントローラは、まず検出した上で、iOSデバイスやApple TV、Macに接続する必要がありま す。検出プロセスは、コントローラとデバイスの両方でトリガされ、相互に接続することができま す。次に、見つかったコントローラとペアリング処理の後、実際に接続します。新しいコントローラ の検出は、1度だけ行います。その後、デバイスとコントローラの電源を同時にオンにすると、自動 的に検出して接続します。 一般的に、検出はゲームの外で行います。つまり、通常プレーヤーはゲームを起動する前にコント ローラをペアリングします。ただし、プレーヤーが新しいコントローラの検出をゲーム内でも行える ようにすることができます。 検出プロセスは次の手順で進みます。 1. 新しいコントローラの検出処理を起動。完了ハンドラを渡して、クラスメソッド startWirelessControllerDiscoveryWithCompletionHandler:を呼び出します。新しいコン トローラが自動的に検出され、デバイスとペアリングされます。 2. 検出プロセスは、一定期間経過すると停止しますが、短時間で終了させるために、 stopWirelessControllerDiscoveryクラスメソッドを呼び出すことができます。 3. 検出プロセスが終了すると、Game Controllerフレームワークによって完了ハンドラが呼び出され ます。 検出のサポートを実装する場合に役立つガイドラインは次のとおりです。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 25 コントローラの検出と接続 接続されたコントローラを検出する ● ● 適切なユーザインターフェイスを設計し、ゲームの画面に表示してください。検出モードの際に 表示するユーザインターフェイスは用意されていません。フレームワークは検出プロセスを管理 するだけです。プロセスを開始し、検出プロセスを実行している間はキャンセルボタンに変わる ボタンをユーザインターフェイスで提供することができます。 ゲームの進行は、検出が終わるまで停止する必要があります。このプロセスは長時間かかること があり、コントローラのペアリング中は、ゲームを操作できません。 接続されたコントローラを検出する アプリケーションの起動が終了したら、オペレーティングシステムにより接続されているコントロー ラのリストが自動的に作成されます。controllersのクラスメソッドを呼び出し、接続されているコ ントローラのGCControllerオブジェクトの配列を取得できます。これを介して必要な設定をし、入 力データを読み取ることになります。接続されているコントローラがない場合、またはアプリケー ションの起動中にこのメソッドを呼び出した場合、配列は空です。 コントローラの初期状態のリストが生成された後で、Game Controllerフレームワークは、コントロー ラが接続されればGCControllerDidConnectNotification、切断されれば GCControllerDidDisconnectNotificationの通知を送ります。ゲームで適切なユーザ体験を提供す るために、両方の通知をほぼ常に登録する必要があります。通知オブジェクトのobjectプロパティ は、状況が変更されたコントローラのGCControllerオブジェクトを保持します。 コントローラの数は変わる可能性があるため、ゲームに適した動作が必要です。以下にガイドライン をいくつか挙げます。 ● ● ● ● コントローラが接続されていない場合、ゲームの制御に標準的なユーザインターフェイスを使い ます。 コントローラが1台接続されている場合、必ず それを使います。 複数のコントローラが接続され、その1つが組み込み型コントローラの場合、それをデフォルト のコントローラにします。接続されているコントローラがすべてスタンドアロン型の場合、プ レーヤーにコントローラを選択する方法を提供します。 複数のコントローラが接続され、ゲームで複数のプレーヤーをサポートしている場合、コント ローラを各プレーヤーに割り当てます。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 26 コントローラの検出と接続 コントローラオブジェクトを使用する コントローラオブジェクトを使用する 一般的に、ゲームで使用する、接続されたコントローラのコントローラオブジェクトに対する強い参 照を維持できます。これらのオブジェクトを使って、コントローラ関連のタスクを実行します。たと えば、次のタスクを実行しなければならないことがあります。 ● ● ● ● 組み込み型コントローラかどうかなど、コントローラに関する情報を取得する。 特定のプレーヤーに関連付けることができるように、コントローラにプレーヤーの番号を構成す る。 プレーヤーが一時停止ボタンを押したときに呼び出されるオブジェクトの controllerPausedHandlerプロパティにブロックを割り当てる。 コントローラオブジェクトのプロファイルプロパティを読み取り、コントローラの入力を取得す る。“コントローラの要素を処理する”を参照してください。 これらのタスクのいくつかは、ここで紹介します。詳細については、『GCController Class Reference 』 を参照してください。 プレーヤーの番号(インデックス)によりコントローラを識別する プレーヤーの番号は、コントローラを特定のプレーヤーに関連付けます。あるゲームで、プレーヤー がどのコントローラを使うか決まっている場合、これに合わせてplayerIndexプロパティを設定して ください。たとえば2人ゲームで、2人ともコントローラを使う場合、一方を GCControllerPlayerIndex1、もう一方をGCControllerPlayerIndex2とします。プレーヤーの番号 を設定すると、コントローラの該当するLEDが点灯します。同様に、特定のコントローラの使用をや める場合、インデックスをGCControllerPlayerIndexUnsetとしてください。LEDが点灯することは ありません。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 27 コントローラの要素を処理する コントローラを検出した後、そのコントロール要素の状態を、ゲームでどのように解釈するか、対応 づけ(マッピング)を行う必要があります。Game Controllerフレームワークにより、接続されているコ ントローラの種類に関わらず、これらのマッピングが簡単になります。この章では、以下のトピック について学習します。 ● ● コントロール要素(物理的なハードウェア)をゲームでどのように解釈するか、対応づけを行う上 で、プロファイルが果たす役割 コントローラのコントロール要素を使用するための様々な戦略 コントローラプロファイルを使ってコントロール値とその解 釈方法を対応づける コントローラプロファイルには、コントロールを論理的な単位(要素 )に対応づける働きがあります。 ゲームコントローラは、複数のプロファイルをサポートします。ゲームコントローラがプロファイル をサポートする場合、プロファイルにより対応づけられたすべてのコントロール要素が、物理コント ローラに存在します。ゲームを実装する場合、サポートするプロファイルを選択し、それらのプロ ファイルの該当する要素を読み取って、入力データを受け取ります。Game Controllerフレームワーク には、物理制御データを、論理的なプロファイルの要素に対応づける働きがあります。 コントローラのプロファイルは、Game Controllerフレームワークのクラスとして実装されています。 表 3-1に、利用可能なプロファイルと、GCControllerクラスの対応するプロパティを示します。 表 3-1 ゲームコントローラのプロファイル プロファイル 実装クラス GCControllerのプロパ ティ ゲームパッド(標準型のコントロール要素 の配置) GCGamepad gamepad 拡張型ゲームパッド(拡張型のコントロー ル要素の配置) GCExtendedGamepad extendedGamepad 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 28 コントローラの要素を処理する コントローラプロファイルを使ってコントロール値とその解釈方法を対応づける コントローラがあるプロファイルをサポートしているかどうかは、コントローラのGCControllerオ ブジェクトの該当するプロパティを参照することにより判断できます。値がnilであれば、当該プロ ファイルはサポートしていないことになります。そうでなければ、当該オブジェクトを介してコント ロール要素にアクセスできます。 プロファイルの処理に関するガイドラインを以下に示します。 ● ゲームを進めるために、少数のコントロール要素で足りるならば、gamepadプロファイルを使い ます。コントローラは、すべてgamepadプロファイルを必ずサポートしなければなりません。 ● iOS用にゲームを開発している場合、gamepadプロファイルをサポートしている必要があります。 拡張型のプロファイルをオプションでサポートできます。 ● OS X/tvOS用のゲームは、拡張型のプロファイルの使用を要求することができます。 ● ゲームが両方のプロファイルをサポートする場合、コントローラが拡張型のプロファイルをサ ポートしているかどうかを最初に確認し、それから、拡張型のプロファイルを利用できない場合 にのみ、gamepadプロファイルを確認します。 同じコントローラについて、複数のプロファイルを同時に読み込むことも可能です。この場合、同じ コントロール要素(ハードウェア)が、複数のプロファイルの論理的な要素にマップされうることに注 意してください。 様々な種類の要素が、Game Controllerフレームワークのクラスで表されます。要素に共通の動作を実 装した、GCControllerElementの派生クラスです。プロファイルを表すクラスには、コントロール 要素の値に対応する1つ以上のプロパティがあります。表 3-2に、要素の型とそれを実装するクラスを 示します。 表 3-2 ゲームコントローラの要素の型 要素のタイプ 実装クラス 要素の値 ボタン GCControllerButtonInput 0以上1以下の浮動小数点数。また、ボタン 軸 GCControllerAxisInput -1以上1以下の浮動小数点数。 方向パッド(D パッド) GCControllerDirectionPad 2つの軸または4方向のボタンとして読み取 り。 が押されたかどうかを示すブール値として 読み取ることもできます。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 29 コントローラの要素を処理する コントローラプロファイルを使ってコントロール値とその解釈方法を対応づける プレイヤが物理コントローラを操作すると、そのハードウェア入力がGame Controllerフレームワーク に送信されます。フレームワークは物理コントロールごとに、ハードウェア信号を正規化し、一貫性 のある値を求めます。次に、その結果に基づき、コントローラがサポートするプロファイルの要素を すべて更新します。 プロファイルの入力要素を読み込む方法として次のようなものがあります。 ゲームのレンダリングループ内でポーリングすることにより、必要な要素の値を取得する方法。 この直接読み取り法は、方向パッドのように、フレームごとに読み取る必要がある要素に向いて います。詳しくは“要素の値を直接読み取る” (30 ページ)を参照してください。 ● 値が変化したときに呼び出されるブロックを登録しておく方法。特定の要素について登録して も、プロファイルの全要素について登録しても構いません。値の変化をすべて検出したい場合に 向いています。“要素の状態が変化したときに呼び出されるよう登録する” (31 ページ)を参照 してください。 ● スナップショットを使用して、現在のコントロール要素の状態を保存します。プロファイルのコ ントロール要素は、すべて同時に読み取られてスナップショットに保存されるため、この状態を 後で利用することができます。 ● 要素の値を直接読み取る 多くのゲームは、レンダリングループを使って実装されています。ループごとに、状態の変化、ゲー ムロジック、プレイヤの入力を処理します。その一環として、ポーリング方式で必要な要素の値を取 得する、という簡単な方式がよく使われます。 リスト 3-1にその実装例を示します。このメソッドはフレーム処理の都度呼び出されると想定します。 たとえばSprite Kitを使って構築したゲームであれば、シーンのupdate:メソッドから要素の情報をポー リングするとよいでしょう。リスト 3-1では、拡張型のgamepadプロファイルの3つの要素を読み取り ます。親指スティックを使って宇宙船の推力を制御し、左右のトリガ(L2/R2ボタン)で、レーザやミサ イルを発射します。 リスト 3-1 プロファイルの要素をポーリングするコード例 - (void) readControlInputs { GCExtendedGamepad *profile = self.myController.extendedGamepad; if (profile.rightTrigger.isPressed) [self fireLasers]; if (profile.leftTrigger.isPressed) [self launchMissile]; 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 30 コントローラの要素を処理する コントローラプロファイルを使ってコントロール値とその解釈方法を対応づける [self applyThrust: profile.leftThumbstick.yAxis.value]; } この例では、pressed プロパティを武器に使用しますが、値のプロパティは宇宙船の推力に使用され ています。武器は発射するかしないかの2通りしかありません。ただし、宇宙船の推力は、プレーヤー が親指スティックを動かした距離に基づいて計算されるため、代わりにvalueプロパティを使用する 必要があります。 要素の状態が変化したときに呼び出されるよう登録する ゲームによっては、要素の状態が変化したちょうどその時点で呼び出されるようにする方がよいで しょう。たとえば、フレーム間であっても、ボタンが押されたらすべて検出したい、ということがあ ります。これを実装するため、状態の変化に応じて呼び出されるハンドラを登録します。Game Controller フレームワークは、主スレッド上でプロファイルを処理し、更新します。プロファイルに記述されて いる要素の値が変化する都度、該当するハンドラが呼び出されるのです。ハンドラは、プロファイル オブジェクトに対してでも、その特定の要素に対してでも登録可能です。前者の場合、どの要素の状 態が変化しても呼び出されます。いくつか同時に変化した場合、それぞれについて1回ずつ呼び出さ れることになります。一方、特定の要素に対して登録した場合、当該要素またはその子要素の状態が 変化したときにハンドラが呼び出されます。 リスト 3-2に、プロファイルオブジェクトに対して登録するハンドラの実装例を示します。2つのトリ ガのうち、どちらが押されたかを調べています。 リスト 3-2 プロファイルの状態変化に応じて呼び出される、ハンドラを登録するコード例 GCExtendedGamepad *profile = self.myController.extendedGamepad; profile.valueChangedHandler = ^(GCExtendedGamepad *gamepad, GCControllerElement *element) { if ((gamepad.rightTrigger == element) && gamepad.rightTrigger.isPressed) [self fireLasers]; if ((gamepad.leftTrigger == element) && gamepad.leftTrigger.isPressed) [self launchMissile]; }; 個別にハンドラを実装し、対応するボタンに登録する、という方法も考えられます。リスト 3-3に、 左右のトリガに対して個別にハンドラを登録する例を示します。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 31 コントローラの要素を処理する コントローラプロファイルを使ってコントロール値とその解釈方法を対応づける リスト 3-3 要素に対して個別にハンドラを登録するコード例 GCExtendedGamepad *profile = self.myController.extendedGamepad; profile.rightTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { if (pressed) [self fireLasers]; }; profile.leftTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { if (pressed) [self launchMissile]; }; スナップショットを使ってコントローラ入力を直列化する スナップショットは特殊なプロファイルオブジェクトで、記録した時点における、各要素の値をすべ て保持しています。後で必要になってから、コントロール値を読み取って使うことができます。製品 が対応できる用途として、次のものがあります。 ● あるスレッドで入力を読み取り、別のスレッドに転送して処理を委ねる。 ● ネットワーク経由でコントローラ入力を送信する。 ● コントローラのデータをファイルに保存する。ゲームのセッションを保存しておき、後で再現す る、あるいはデバッグに役立てる、といった使い方が考えられます。 プロファイルクラスには、それぞれスナップショットクラスが1つあります。保存しようとするプロ ファイルに対応する、プロファイルクラスの派生クラスとして実装します。スナップショットの生成 には、プロファイルオブジェクトのsaveSnapshotメソッドを使います。スナップショットオブジェ クトはプロファイルオブジェクトでもあるので、同じ方法で値を読み取ることができます。コント ローラ入力の処理用に実装したコードを流用できるかも知れません。 スナップショットを直列化(シリアライズ)してバイナリファイルに出力し、ネットワーク経由で送 信したり、ディスクに保存したりする場合は、スナップショットのsnapshotDataプロパティを取得 してください。一方、保存済みのスナップショットからは、次の2通りの方法でデータを読み取れま す。 ● 当該スナップショットの生成に用いたのと同じクラスの、新しいスナップショットオブジェクト を生成し、initWithSnapshotData:メソッドで初期化する方法。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 32 コントローラの要素を処理する コントローラプロファイルを使ってコントロール値とその解釈方法を対応づける ● NSDataオブジェクトに、当該スナップショットのsnapshotDataプロパティを代入する方法。こ の場合、スナップショットの要素がすべて更新され、対応するハンドラが呼び出されます。 推奨される特定の要素の型 ボタンと親指スティックの要素の型に関するガイドラインを次に示します。 ボタンとトリガ ボタン要素を読み取った場合、ボタンが押されたかどうかを判断したり、ボタンにかけられた圧力を 判断したりできます。ボタンが押されたかどうかのみを確認するには、常にpressedプロパティを使 用します。Game Controllerフレームワークは、自動的に発見的方法を使用して、ボタンが押されたか どうかを判断します。valueプロパティは、ボタンが実際に押されたことを知る必要がある場合にの み使用します。圧力を測定する場合、圧力がかけられたことをボタンが認識するまで、最低量の圧力 を必要とします。つまり、ボタン要素により返される最初のゼロ以外の値が、想定より大きくなる可 能性があります。ボタンがこのしきい値を超えると、完全に手を離すまで、ゼロ以外の値を測定し続 けます。 親指スティックと方向パッド 従来、コントローラの親指スティックは、問題が発生しやすいコントロール要素であり、親指スティッ クのデッドゾーンを埋め合わせたり、デバイスの許容値を超えた値を制御したりするために、ゲーム のコードを追加で記述する必要がありました。別のプラットフォームからコードを移植している場 合、iOSまたはOS Xでコード使用する場合は、この部分を無効にする必要があります。Game Controller フレームワークが、これらの計算を自動的に行います。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 33 tvOSの制御入力 Apple TVには、iOSデバイスと同様、ゲームコントローラを接続できます。するとゲームコントローラ は、フォーカスベースのユーザーインターフェイスを制御するためにも使えるようになります。コン トローラからの低レベル入力情報を、自動的に高レベルのイベントに変換し、レスポンダチェーンを たどって配送するようになっています。UIKitとフォーカスのやり取りにしか依存していないアプリ ケーションであれば、ゲームコントローラに対応するために何かする必要はありません。Apple TVリ モコンとゲームコントローラのどちらを使っているか意識しなくても済むよう、tvOSが透過的に処理 しているからです。 Game Controllerフレームワークには、Apple TVに対応するための大きな変更事項があります。 ● ● マイクロゲームパッドコントローラ用のプロファイル(GCMicroGamepad)が追加されました。 Apple TVリモコンの能力に特化して記述しています。 ビューコントローラのクラスとして、GCEventViewControllerが追加されています。コントロー ラやリモコンの入力情報をアプリケーションに配送する方法の制御に用います。 コントローラの制約 Apple TVには2台までのゲームコントローラ(および1台のリモコン)しか接続できません。ゲームの 設計に当たっては、この制約を頭に入れておく必要があります。 Apple TVリモコンをゲームコントローラとして使う Apple TVリモコンは、制限つきですが、ゲームコントローラとしても使えます。他のコントローラと 同様、Game Controllerフレームワークでは、GCControllerオブジェクトを介して処理します。この リモコンはGCMotionとGCMicroGamepadの両方のプロファイルに対応しています。マイクロゲーム パッドのプロファイルは、Apple TVリモコンしか使えません。他のゲームコントローラにも対応する ためには、拡張ゲームパッドのプロファイルも必要です。 リモコンをゲームコントローラとして使う場合、次のような特性があります。 ● リモコン上のタッチパッドは、十字キーとして使えます。十字キーからはアナログ入力データが 得られます。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 34 tvOSの制御入力 コントローラ入力の配送先を決める ● リモコンは縦横どちらの向きでも使えます。アプリケーションを開発する際には、ユーザーがリ モコンの向きを変えたとき、プロファイルオブジェクトが自動的に入力データの向きを読み替え るかどうか、決めておく必要があります。 ● タッチパッドを強く押すと「A」ボタンとして働きます。 ● リモコンの「Play/Pause」ボタンは「X」ボタンとして働きます。 ● ● リモコンの「Menu」ボタンは、ゲームの一時停止ボタンとして働き、コントローラオブジェクト の「一時停止」ハンドラが呼び出されます。 リモコンは動きデータ(およびGCMotionプロファイル)に対応していますが、傾きや回転を認識 することはできません。対応するプロパティの値は常に定数です。 コントローラ入力の配送先を決める iOSの場合、ゲームコントローラのイベントは、Game Controllerフレームワークを介して、デバイス上 のタッチイベントと並行して受け取れます。一方、tvOS上のUIKitは、デフォルト状態の場合、低レベ ルのコントローラ入力をすべて高レベルのイベントに変換し、レスポンダチェーンをたどって配送し ます。低レベルのコントローラ入力そのものは配送されません。イベントをすべてUIKitが処理してし まうからです。アプリケーション側でコントローラ入力を直接取得したければ、UIKitの変換処理を止 める必要があります。「コントローラ入力の配送先」に、コントローラ入力を配送する2つの経路を 示します。 図 4-1 コントローラ入力の配送先 ゲームは一般に、主たるメニュー画面と、実際にゲームをする画面から成ります。メニュー画面は UIKitの要素を使って、フォーカスベースの挙動になるよう実装します。ゲーム画面になったら、Game Controllerフレームワークを使ってUIKitの変換処理を無効にし、コントローラ入力を直接読み取るよう にします。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 35 tvOSの制御入力 コントローラ入力の配送先を決める Game Controllerフレームワークを使って低レベル入力を読み取る場合、GCEventViewController(ま たはそのサブクラス)を使ってゲーム画面を表示する必要があります。GCEventViewControllerオ ブジェクトのビューやサブビューがファーストレスポンダであれば、デフォルト状態の場合、ゲーム コントローラ入力はまずビューコントローラが受け取り、Game Controllerフレームワークを介してア プリケーション側に配送します。イベントがUIKitに配送されることはありません。一方、ビューコン トローラの階層を外れたビューがファーストレスポンダであれば、イベントは通常どおり、UIKitが処 理します。 レスポンダチェーン内にGCEventViewControllerオブジェクトがあれば、その controllerUserInteractionEnabledプロパティを使ってイベントの配送先を切り替えることも可 能です。たとえば、UIKitの要素で構成したメニュー画面に、ゲーム表示の一部であるMetalコンテン ツが混在している場合、ゲームが一時停止状態になったら、controllerUserInteractionEnabled プロパティの値を切り替えて、UIKitにイベントを配送する必要があります。この場合、メニュー項目 の中に、ゲームを再開するためのボタンが必要です。コントローラの一時停止ハンドラが呼び出され ることはないからです。このボタンが押されたら、ゲームコントローラがイベントを処理する状態に 戻した上で、ゲームを再開します。 何らかの理由で、GCEventViewControllerオブジェクトでイベントの伝播方法を制御できない場合 でも、この挙動を独自に実装することは可能です。そのためには、ビューまたはビューコントローラ のpressesBegan:withEvent:メソッド(および押下イベントを処理する他のイベントハンドラ)を オーバーライドします。独自に処理せず、UIKitに配送して処理を委ねたいイベントがあれば、同じメ ソッドの、スーパークラス側の実装を呼び出します。逆にGame Controllerフレームワークのみで処理 したければ、スーパークラス側を呼び出してはなりません。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 36 コントローラを追加する際のチェックリスト この付録では、このドキュメントで説明している重要な問題を、iOS用とMac用の2つのチェックリス トでまとめています。 iOSのチェックリスト iOSの要件 ゲームコントローラの使用を必須にしないでください。 標準型のコントロール要素の配置をサポートしている必要があります。 スタンドアロン型コントローラを使用している場合、デバイスにアクセスしなくても ゲームを進められる必要があります。 コントローラの一時停止ボタンをサポートしている必要があります。ゲームの一時停 止と再開が切り替わるようにしてください。 ゲームでタッチスクリーンを使用しない場合は、画面のアイドルタイマーを無効にす る必要があります。詳細については、idleTimerDisabledプロパティを参照してくだ さい。 iOSデバイスが組み込み型コントローラの内側に配置されたら、横向きでしか実行しな いようにしてください。 コントローラで制御している間は、仮想コントロール要素を非表示にする必要があり ます。 コントローラが接続されたら、プレーヤーの番号を適切な値に設定します。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 37 コントローラを追加する際のチェックリスト tvOSのチェックリスト iOSの推奨事項 ゲームで使用されるコントロール要素を説明するユーザインターフェイスを準備しま す。コントロール要素の標準的な名前を使用します。 コントローラの接続または切断に合わせて適切に反応します。 プレーヤーが理解して操作しやすいコントロール要素の配置にします。 親指スティックのデッドゾーンを埋め合わせるコードをアプリケーションから削除し ます。 ボタン要素を使用しているとき、ボタンが押されているかを判断するにはpressedプ ロパティを使用します。valueアナログプロパティは、ボタンが実際に押されたかど うかでゲームの進行が左右される場合にのみ使用します。 tvOSのチェックリスト tvOSの要件 ゲームコントローラの使用を必須にしないでください。 tvOSをサポートするコントローラは、すべて拡張型のコントロール要素の配置になっ ているため、ゲームで拡張型のコントロール要素の配置を必須にすることができます。 コントローラの一時停止ボタンをサポートしている必要があります。ゲームの一時停 止と再開が切り替わるようにしてください。特段の理由がない限り、リモコンの停止 ボタンが押されたら、前のメニュー画面に戻るようにしてください。 コントローラ入力を直接使っている場合、画面のアイドルタイマーは無効にしてくだ さい。詳細については、idleTimerDisabledプロパティを参照してください。 tvOSの推奨事項 ゲームで使用されるコントロール要素を説明するユーザインターフェイスを準備しま す。コントロール要素の標準的な名前を使用します。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 38 コントローラを追加する際のチェックリスト OS Xのチェックリスト コントローラが接続されたら、プレーヤーの番号を適切な値に設定します。 コントローラの接続または切断に合わせて適切に反応します。 プレーヤーが理解して操作しやすいコントロール要素の配置にします。 親指スティックのデッドゾーンを埋め合わせるコードをアプリケーションから削除し ます。 ボタン要素を使用しているとき、ボタンが押されているかを判断するにはpressedプ ロパティを使用します。valueアナログプロパティは、ボタンが実際に押されたかど うかでゲームの進行が左右される場合にのみ使用します。 OS Xのチェックリスト OS Xの要件 ゲームコントローラの使用を必須にしないでください。 OS Xをサポートするコントローラは、すべて拡張型のコントロール要素の配置になっ ているため、ゲームで拡張型のコントロール要素の配置を必須にすることができます。 スタンドアロン型コントローラを使用している場合、Macにアクセスしなくてもゲー ムを進められる必要があります。 コントローラの一時停止ボタンをサポートしている必要があります。ゲームの一時停 止と再開が切り替わるようにしてください。 コントローラが接続されたら、プレーヤーの番号を適切な値に設定します。 OS Xの推奨事項 ゲームで使用されるコントロール要素を説明するユーザインターフェイスを準備しま す。コントロール要素の標準的な名前を使用します。 コントローラの接続または切断に合わせて適切に反応します。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 39 コントローラを追加する際のチェックリスト OS Xのチェックリスト プレーヤーが理解して操作しやすいコントロール要素の配置にします。 親指スティックのデッドゾーンを埋め合わせるコードをアプリケーションから削除し ます。 ボタン要素を使用しているとき、ボタンが押されているかを判断するにはpressedプ ロパティを使用します。valueアナログプロパティは、ボタンが実際に押されたかど うかでゲームの進行が左右される場合にのみ使用します。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 40 書類の改訂履歴 この表は「Game Controllerプログラミングガイド 」の改訂履歴です。 日付 メモ 2015-10-21 playerIndexプロパティの設定に関する節を書き換えました。tvOSに 関するガイダンスを追加しました。 2014-03-19 このドキュメントのガイダンスを大幅に加筆修正。 2013-09-18 新規資料。ゲームコントローラ(ハードウェア)の制御機能をアプ リケーションに組み込む方法。 2015-10-21 | Copyright © 2015 Apple Inc. All Rights Reserved. 41 Apple Inc. Copyright © 2015 Apple Inc. All rights reserved. 本書の一部あるいは全部を Apple Inc. から書 面による事前の許諾を得ることなく複写複製 (コピー)することを禁じます。また、製品 に付属のソフトウェアは同梱のソフトウェア 使用許諾契約書に記載の条件のもとでお使い ください。書類を個人で使用する場合に限り 1 台のコンピュータに保管すること、またそ の書類にアップルの著作権表示が含まれる限 り、個人的な利用を目的に書類を複製するこ とを認めます。 Apple ロゴは、米国その他の国で登録された Apple Inc. の商標です。 キーボードから入力可能な Apple ロゴについ ても、これを Apple Inc. からの書面による事 前の許諾なしに商業的な目的で使用すると、 連邦および州の商標法および不正競争防止法 違反となる場合があります。 本書に記載されているテクノロジーに関して は、明示または黙示を問わず、使用を許諾し ません。 本書に記載されているテクノロジー に関するすべての知的財産権は、Apple Inc. が保有しています。 本書は、Apple ブランド のコンピュータ用のアプリケーション開発に 使用を限定します。 本書には正確な情報を記載するように努めま した。 ただし、誤植や制作上の誤記がないこ とを保証するものではありません。 Apple Inc. 1 Infinite Loop Cupertino, CA 95014 U.S.A. Apple Japan 〒106-6140 東京都港区六本木 6 丁目10番1号 六本木ヒルズ http://www.apple.com/jp Offline copy. Trademarks go here. Apple Inc. は本書の内容を確認しておりますが、本 書に関して、明示的であるか黙示的であるかを問わ ず、その品質、正確さ、市場性、または特定の目的 に対する適合性に関して何らかの保証または表明を 行うものではありません。その結果、本書は「現状 有姿のまま」提供され、本書の品質または正確さに 関連して発生するすべての損害は、購入者であるお 客様が負うものとします。 いかなる場合も、Apple Inc. は、本書の内容に含ま れる瑕疵または不正確さによって生じる直接的、間 接的、特殊的、偶発的、または結果的損害に対する 賠償請求には一切応じません。そのような損害の可 能性があらかじめ指摘されている場合においても同 様です。 上記の損害に対する保証および救済は、口頭や書面 によるか、または明示的や黙示的であるかを問わ ず、唯一のものであり、その他一切の保証にかわる ものです。 Apple Inc. の販売店、代理店、または従 業員には、この保証に関する規定に何らかの変更、 拡張、または追加を加える権限は与えられていませ ん。 一部の国や地域では、黙示あるいは偶発的または結 果的損害に対する賠償の免責または制限が認められ ていないため、上記の制限や免責がお客様に適用さ れない場合があります。 この保証はお客様に特定 の法的権利を与え、地域によってはその他の権利が お客様に与えられる場合もあります。
© Copyright 2024 Paperzz