すべてのフォーム ファクタでナチュラル入力を有効にする

キーボードとマウスを備えたデスクトップ パソコン。画面にゲームが表示され、方向操作とマウスのタッチスクリーン入力が表示されています。
図 1. キーボード、マウス、タッチスクリーンによる入力。

Android デバイスにはさまざまな形とサイズがあります。スマートフォン、タブレット、PC、テレビ、自動車、XR ヘッドセットなど、プレーヤーがどこでもプレイできるようにすることで、ゲームのリーチを拡大できます。ここでは、次の内容について学習します。

  • マウスキーボードのサポートにより、PCChromeOS のプレーヤーにゲームを提供する方法と、大画面デバイスでのプレイアビリティを向上させる方法。
  • ゲームパッドを統合して、熱心なプレーヤーが利用しているデバイスでゲームをプレイできるようにする方法。
  • 外出先でも正確でレスポンシブなゲームプレイを実現するために、タッチペンのサポートを追加する方法。
  • テレビ コントローラをサポートし、プレーヤーが所有する最大の画面であるテレビを活用する方法。
  • 入力方法を切り替えるタイミングに関する設計上の考慮事項
  • プレーヤーの入力設定をサポートするために、クロス フォーム ファクタのゲームが行う処理。
  • その他。

自動互換性

Android では、可能な場合はタッチ以外のデバイスとの自動互換性があります。たとえば、次のようなデバイスが該当します。

  • dispatchTouchEvent/onTouchEvent は、クリックやタッチペン入力の場合でもモーション イベントで応答します。つまり、ツールタイプをチェックしない場合、タッチ処理ロジックはマウスとタッチペンで機能します。
  • 一部の未処理のゲームパッド イベントとテレビ コントローラ イベントが、キーボード イベントとして再送信されます。
  • Play Games や ChromeOS などの PC のようなフォーム ファクタでは、デフォルトでマウスクリックからタッチが生成されます。タッチスクリーンがない場合でも、基本的なレベルの互換性が確保されます。

  • マウスイベントとタッチペンイベントはタッチ コールバックに送信されます。

  • 処理されないゲームパッド イベントとテレビ コントローラ イベントは、キーボード イベントとして再送信されます。

  • Google Play Games や ChromeOS などの PC のようなフォーム ファクタでは、タッチスクリーン入力を想定したゲームとの互換性を最大限に高めるために、デフォルトでマウスイベントではなくタップイベントが生成されます。

最適なユーザー エクスペリエンスを実現するには、自動互換性に依存するのではなく、タッチ以外の入力を直接サポートするように実装します。

すべてのフォーム ファクタをサポートする

Android は、増え続けるデバイスで動作します。プレーヤーがスマートフォンを広げて大画面タブレットにしたとき、Android 対応のテレビの電源を入れたとき、Chromebook で Android ゲームを開いたとき、充電を待つ間車内でゲームを起動したときなど、これまで以上に多くの場所で、多くのディスプレイでプレーヤーを引き付けることができます。プレーヤーがゲームをプレイできる場所を確認してください。

フォーム ファクタ 一般的なデフォルト入力 タッチスクリーン マウスとキーボード ゲームパッド タッチペン1 5 方向 D-pad
電話 タッチスクリーン
大画面 タッチスクリーン
PC2 マウスとキーボード × いいえ ×
ChromeOS3 タッチパッド、マウス、キーボード ときどき
テレビ 5 方向 D-pad × いいえ
自動車4
(Automotive OS)
タッチスクリーン いいえ
視聴5 タッチスクリーン いいえ × × ×

この表は、各フォーム ファクタで想定される入力をハイライト表示することで、新しい入力メカニズムのサポートに優先順位を付けるのに役立ちます。次の点にご注意ください。

  • デフォルトの入力メカニズムを 1 つだけ使用しない。タッチレス キャンペーンのリーチが意図せず制限される可能性があります。たとえば、ほとんどのプレーヤーは ChromeOS ゲームをマウスとキーボードでプレイしたいと考えていますが、デバイス プロファイルによっては、タッチスクリーン サポートを希望するプレーヤーもいるかもしれません。
  • 入力メカニズムをフォーム ファクタにロックしないようにする。Android はさまざまな周辺機器に対応しており、ハイブリッド デバイスの人気が高まっています。スマートフォン向けビルドからキーボードのサポートを削除すると、取り外し可能なキーボードが付属しているタブレットをお持ちのプレーヤーは、ゲームが不完全だと感じる可能性があります。

マウス入力

プレーヤーが最も大きな画面で臨場感あふれるゲームをプレイするデバイスは、ChromeOS ノートパソコン、Android タブレット、PC など、Android を搭載している可能性があります。多くのプレーヤーは、このようなデバイスでマウスを使ってゲームをプレイすることを想定しています。サポートを追加することで、プレーヤーのエンゲージメントを高めることができます。Android は、次のようなデスクトップ オペレーティング システムに共通する一般的な機能をサポートしています。

  • 左クリック、右クリック、中クリックのサポート、戻る進むなどの追加ボタン
  • スクロール ホイールの検出
  • マウスの動きに関する絶対値または相対値(ポインタ キャプチャ)のレポート
  • カスタム ポインタ アイコンを定義する機能

フォーム ファクタに固有のガイドは次のとおりです。

タッチパッド入力

Android のタッチパッド入力キャプチャは、マウスのサポートとは若干異なります。requestPointerCapture() を呼び出すと、パッドのタップへの未加工アクセスをリクエストします。つまり、タッチスクリーンからマルチタッチ イベントを受け取るのと同じ方法で、タッチごとにイベントを受け取ります。ただし、座標はディスプレイの座標空間ではなくタッチパッドの座標空間になります。このモードでは、Android の内蔵タッチパッド ジェスチャー検出と手のひらフィルタリングが無効になります。たとえば、ユーザーがパッド上で 1 本の指を動かしながら、親指を左下隅に置いてクリックの準備をしている場合、(カメラを動かすなど)ロジックで使用する指の動きを決定するのはゲーム次第です。

つまり、タッチパッドが組み込まれたゲームパッドは、タッチスクリーンのように使用して、堅牢なジェスチャー ベースの入力を行うことができます。

ポインタ キャプチャ中にプレーヤーがマウスとタッチパッドのどちらを使用しているかを確認するには、InputDevice#getSources() または MotionEvent#getSource() のいずれかで InputDevice.SOURCE_TOUCHPAD のソース値を確認します。

キーボード入力

キーボードのサポートは、ほぼすべての Android デバイスで利用できます。開発するゲームの種類に応じて、ゲームにキーボード認識を追加するメリットは、ゲームのアクセスしやすさを高めてプレーヤー ベースを拡大することから、ゲームをより没入感のある直感的なものにすることまで、多岐にわたります。

キーボード サポートでゲームを改善するための一般的な方法は次のとおりです。

  • タッチ非対応デバイスでは、マルチタッチ メカニクスをキーボードにマッピングする必要があります。移動やジャンプなど、2 つ以上のタップ操作を同時に行う必要があるゲームでは、これらの操作をキーボードの押下操作にマッピングすることで、大画面やタッチスクリーン以外の画面でのプレイアビリティを向上させることができます。
  • メニューをキーボードで操作できるようにする。メニューや静的なゲームプレイ要素にボタン ナビゲーション(矢印キーや Enter など)を追加すると、テレビでゲームをプレイできるようになります。また、すべてのフォーム ファクタでアクセスしやすくなります。
  • 画面上のアクションのホットキーを追加。プレーヤーが画面上でタップできるものをすべてキーボード アクションにマッピングします。戦略ゲームでユニットを選択したり、アクション ゲームでインベントリ スロットを有効にしたりといったアクションにクイック アクセスすることで、プレーヤーはゲームに没頭できます。

QWERTY キーボードは非常に一般的ですが、さまざまな一般的なレイアウトがあり、あるレイアウトでは 1 回押すだけで入力できる文字が、別のレイアウトでは複数のキーを押す必要がある場合があります。

ゲームでキーの相対位置を使用してアクションを実行する場合(矢印キーのように WASD を使用して移動するなど)は、InputDevice.getKeyCodeforKeyLocation() を使用して QWERTY キーの位置を KeyEvent.getKeyCode() のキーコードにマッピングします。プレーヤーのレイアウトが変更された場合は、onInputDeviceChanged() が呼び出されます。

ゲームにテキスト入力を追加する場合、GameActivity の TextInput を使用すると、ゲーム内のテキスト レンダリング エンジンを引き続き使用しながら、IME 入力、アクセント記号、地域固有のレイアウトの変更を信頼性を持って処理するメカニズムを利用できます。これにより、キーボード入力を直接処理したり、オフスクリーンの EditText ウィジェットを使用したりすることによる多くの落とし穴を回避できます。

ゲームパッド入力

一般的なゲームパッドの画像。方向パッド、a、b、x、y の 4 つのフェイスボタン、2 つのアナログ スティック、4 つのトリガーがあります。画像には番号が記載されていますが、このページでは参照されていません。
図 2. ゲームパッド入力。

ゲームパッドは、接続と切断のイベント、ハプティクスのサポートジャイロスコープなどの高度な入力のサポート、利用可能な場合はライトの色などの出力のサポートなど、Android 全体で正式にサポートされています

アプリ デベロッパーは View または Activity コールバックを使用してゲームパッド入力をリッスンできますが、ゲーム デベロッパーは ゲーム コントローラ ライブラリを使用することをおすすめします。このライブラリには次のような利点があります。

  • 独自のゲームエンジンへの統合を容易にするため、C++ で記述されている
  • すべてのゲームパッド機能を 1 つの API に集約
  • ゲームパッドのフェイスボタンの記号の曖昧さを解消し、ゲームのラベルをプレーヤーのゲームパッドのボタンと一致させることができます。
  • 一部のゲームパッドではボタンがアナログ入力で、他のゲームパッドではバイナリ入力である場合のゲームパッド イベントのレポートを統一
  • 古い Android デバイスで新しいゲームパッドに対して限定的な上位互換性を提供

タッチペン入力

描画アプリを示す画像。ブラシが開いていて、タッチペンで描画できる図形が表示されています。
図 3. ブラシパレット付きの描画アプリ。

Android では、ほとんどのデバイスで高度なタッチペン サポートが提供されています。これには、圧力、向き、傾斜、ホバー、手のひら検出などが含まれます。互換性を高めるためにタップ コールバックに送信されるタッチペン イベントですが、エンジン ロジックでこれらのイベントが除外される可能性があるため、タッチペン デバイスでテストすることが重要です。完全な統合は、タップ ターゲットが小さいゲームや、自由形式の描画が自然に感じられるゲームに適しています。

タッチペンの動きにレンダリングが追いつかないと、指で遮られた場合や、キーボード、マウス、ゲームパッドのように画面から切断された場合よりも遅延が目立ちます。このため、Android では、ペンの動きから画面への表示までのレイテンシが 4 ミリ秒未満のストロークをレンダリングするための低レイテンシ パイプラインが用意されています。ゲームでこの機能を活用して、ゲームを現実世界と直接結び付ける方法は 3 つあります。

TV コントローラ

Android 用テレビ コントローラの画像。呼び出されるボタンは、D-pad、選択ボタン、マイクまたはアシスタント ボタン、戻るボタン、ホームボタンです。
図 4. テレビ コントローラ。

Android TV デバイスには、4 つの基本方向と [OK] ボタンを備えた5 方向の D-pad が付いたリモコンが付属しています。Android の組み込みウィジェット システムを使用するアプリは、デフォルトでこれらの機能をサポートしていますが、テレビ デバイスでの互換性を維持するには、デベロッパーがゲームのカスタム ウィジェットをテストする必要があります。

詳しくは、Android TV のドキュメントをご覧ください。

その他の考慮事項

プレーヤーに最適なエクスペリエンスを提供するには、複数の入力形式を想定して設計し、それらをその場で切り替えられるようにします。これにより、プレーヤーはゲームモードに応じてさまざまな入力方法をすばやく切り替えたり、1 台の Android デバイスのさまざまな構成を簡単に切り替えたりできます。

以下の点にご注意ください。

  • フォーム ファクタでフィルタするよりも、入力の種類の有無を確認する方が適しています。たとえば、ChromeOS でのみマウスとキーボードのサポートを有効にした場合、取り外し可能なキーボードを備えたタブレットを使用しているプレーヤーは、その追加の作業の恩恵を受けることができません。
  • フォーム ファクタ以外にも、最適な入力形式に影響する考慮事項があります。たとえば、ユーザー補助を必要とするプレーヤーにとって、マウスやタッチスクリーンは使いづらかったり、痛みを伴ったりする可能性がありますが、ゲームパッドやキーボードは理想的です。
  • サポートがないよりは、どんなサポートでも良い。入力の変更に即座に対応するのが理想的ですが、プレーヤーは、サポートが利用可能であれば、サポートがないと感じるよりも、サポートがあると感じるほうが好まれます。
  • 最適な入力はゲームの実行ごとに変わる可能性があります。たとえば、外出先でゲームをプレイする場合はタッチスクリーン、スマートフォンをテレビに接続する場合はゲームパッド、デスクに座ってプレイする場合はマウスとキーボードが適しています。

ユーザー入力に応答する方法

一般的なモバイルゲームは、デバイスごとに 1 人のプレーヤーをサポートしています。最適な結果を得るには、ゲームが考えられるすべての入力に応答し、プレーヤーがアクティブに使用しているものに基づいて UI をシフトします。これにより、1 つのバージョンのゲームがすべてのフォーム ファクタで自動的に動作し、プレーヤーはニーズに合わせて入力を組み合わせることができます。

デベロッパーは、UI をシフトする前に遅延が組み込まれたデフォルトの入力方法を用意することがよくあります。Google を搭載した Android について

  • ほとんどのプレーヤーはタッチスクリーンでプレイするため、起動時にタップ操作を表示します。プレーヤーがキーボードまたはゲームパッドを使ってゲームを開始し、しばらくタッチスクリーンを使用しない場合は、タッチレイヤをフェードアウトします。
  • プレーヤーがゲームパッドを操作していて、キーボードのキーを押した場合、ゲーム内のヒントを切り替えて、ゲームパッド ボタンではなくキーボード ボタンを表示します。
  • プレーヤーがキーボードとゲームパッドの両方を同時に使用している場合は、ディスプレイのちらつきを防ぐため、ヒントのセットから別のセットに UI を切り替える前に遅延を組み込みます。
  • 入力を処理するときに入力ソースのタイプを確認します。キーボードのキーとゲームパッド ボタンの両方がキーダウン イベントを送信します。
  • ゲームで処理できる場合を除き、入力を処理済みとしてマークしないでください。Android では、新しいフォーム ファクタとの互換性を容易にするために、一部のイベントを再送信します。たとえば、ゲームパッド A ボタンを OK ボタンに変換します。

マニフェストで入力サポートをアノテーションする

必須ではありませんが、処理する入力の種類をマニフェスト機能フラグでアノテーションを付けることをおすすめします。一般的なフラグは次のとおりです。

  • android.hardware.type.pc: ChromeOS と PC の両方で入力互換レイヤを無効にして、デベロッパーがマウスイベントを直接処理できるようにします。ゲームがスマートフォンに配信されるように android:required="false" を設定します。
  • android.hardware.gamepad: アプリとゲームは、ゲームパッドをサポートしているかどうかにかかわらず、ゲームパッド イベントを受信します。このマニフェスト フラグを定義して android:required="false" を設定すると、ゲームパッドが接続された Android TV デバイスにゲームを配信できます。

  1. メーカーは一部のデバイスにタッチペンのサポートを組み込むことができますが、サポートが保証されているフォーム ファクタはありません。描画パッドは Android デバイスに接続して、タッチペンとして使用できます。 

  2. 一部の PC ではタッチスクリーンとタッチペンがサポートされていますが、Google Play Games クライアントはホスト オペレーティング システムからのマウスイベントにのみ応答します。互換性を最大限にするため、デフォルトではマウスイベントはタッチイベントとしてクライアントに表示されます。詳しくは、マウス入力のセクションをご覧ください。 

  3. ChromeOS デバイスは通常、マウスとキーボードをサポートしていますが、タッチスクリーンはオプションです。タッチスクリーン対応デバイスの多くは、タッチペン入力もサポートしています。 

  4. Android Automotive OS は、Android が組み込まれている自動車を指し、Android スマートフォンがなくても機能します。このチャートでは、Automotive OS が対象です。Android Auto はスマートフォンから車にアプリを投影します。Android Auto(プロジェクション)をサポートするデバイスにはタッチスクリーンが搭載されていない場合があります。 

  5. Wear OS デバイスの接続は制限されています。Bluetooth 周辺機器をスキャンできますが、OS が接続に失敗することがよくあります。