TV ゲームを作成する

テレビ画面には、モバイルゲーム デベロッパーにとって新しいことの 2 つの考慮事項があります。たとえば、サイズが大きいこと、操作方法、すべてのプレーヤーが同時に視聴できることなどです。

ディスプレイ

テレビ画面用のゲームを開発する際に留意すべき 2 つの主なポイントは、ゲームを横向き用に設計することと、低レイテンシをサポートすることです。

横向き表示のサポート

テレビは常に横向きで、回転させることはできず、縦向きにはなりません。テレビゲームは常に横向きに表示されるようデザインしてください。

自動低遅延モード

ディスプレイによっては、グラフィックの後処理を実行できます。この後処理によりグラフィックの品質は向上しますが、レイテンシが増加する可能性があります。HDMI 2.1 をサポートする新しいディスプレイには自動低遅延モードALLM)があります。このモードは、この後処理をオフにすることで遅延を最小限に抑えます。ALLM について詳しくは、HDMI 2.1 仕様をご覧ください。他のディスプレイが、同様の動作のゲームモードをサポートしている可能性があります。

Android 11 以降では、最小の後処理をリクエストすることで、可能であれば自動低遅延モードまたはゲームモードの使用をウィンドウからリクエストできます。これは、可能な限り最高のグラフィックを提供するよりも低レイテンシが重要なゲームアプリやビデオ会議アプリで特に役立ちます。

最小限の後処理を有効または無効にするには、Window.setPreferMinimalPostProcessing() を呼び出すか、ウィンドウの preferMinimalPostProcessing 属性を true に設定します。すべてのディスプレイが後処理の最小化をサポートしているわけではありません。特定のディスプレイがサポートしているかどうかを確認するには、Display.isMinimalPostProcessingSupported() メソッドを呼び出します。

入力デバイス

テレビにはタッチ インターフェースがないため、適切なコントロールを行い、プレーヤーが直感的で楽しいと感じられるようにすることが何よりも重要です。コントローラの処理には、複数のコントローラの追跡や切断の適切な処理など、注意すべき他の問題もあります。ゲームを含め、すべての TV アプリはコントローラを一貫して処理する必要があります。TV コントローラの使用について詳しくは、TV コントローラの管理をご覧ください。ゲームで TV コントローラを使用する方法については、ゲーム向けコントローラの取り扱いをご覧ください。

キーボードレイアウト

Android 13(API レベル 33)以降では、getKeyCodeForKeyLocation() を使用してキーボード レイアウトを決定できます。たとえば、ゲームは WASD キーを使用した移動をサポートしていますが、A キーと W キーの場所が異なる AZERTY キーボードでは正しく機能しない可能性があります。特定の位置で想定されるキーのキーコードを取得できます。

Kotlin

val inputManager: InputManager? = requireActivity().getSystemService()

inputManager?.inputDeviceIds?.map { inputManager.getInputDevice(it) }
    ?.firstOrNull { it.keyboardType == InputDevice.KEYBOARD_TYPE_ALPHABETIC }
    ?.let { inputDevice ->
        keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W)
        keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A)
        keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S)
        keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D)
    }

Java

InputManager inputManager = requireActivity().getSystemService(InputManager.class);
InputDevice inputDevice = Arrays.stream(inputManager.getInputDeviceIds())
        .mapToObj(inputManager::getInputDevice)
        .filter( device -> device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC)
        .filter(Objects::nonNull)
        .findFirst()
        .orElse(null);
if (inputDevice != null) {
    keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W);
    keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A);
    keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S);
    keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D);
}

この例では、AZERTY キーボードでは、keyUpKeyEvent.KEYCODE_ZkeyLeftKeyEvent.KEYCODE_QkeyDownkeyRight がそれぞれ KeyEvent.KEYCODE_SKeyEvent.KEYCODE_D に設定されています。これで、これらのキーコードのキーイベント ハンドラを作成して、期待される動作を実装できるようになりました。

マニフェスト

ゲームでは、Android マニフェストに必ず含めるべきものがあります。

ゲームをホーム画面に表示する

Android TV のホーム画面では、通常のアプリと別の行にゲームが表示されます。ゲームのリストにゲームを表示するには、アプリ マニフェストの <application> タグ内で android:isGame 属性を "true" に設定します。次に例を示します。

<application
    ...
    android:isGame="true"
    ...
>

ゲーム コントローラのサポートを宣言する

テレビデバイスのユーザーがゲーム コントローラを利用できない場合、あるいはアクティブでない場合があります。ゲームがゲーム コントローラをサポートしていることをユーザーに正しく通知するには、アプリ マニフェストに次のエントリを含める必要があります。

  <uses-feature android:name="android.hardware.gamepad" android:required="false"/>

注: android:hardware:gamepad のサポートを指定する場合は、android:required 属性を "true" に設定しないでください。無効にすると、ユーザーはアプリを TV デバイスにインストールできなくなります。

マニフェスト エントリの詳細については、アプリ マニフェストをご覧ください。

Google Play ゲームサービス

ゲームに Google Play Games サービスを統合している場合は、実績、ログイン、ゲームの保存に関するいくつかの考慮事項に留意する必要があります。

実績

ゲームには、少なくとも 5 つの(獲得可能な)実績がなければなりません。サポートされている入力デバイスからゲームプレイを操作しているユーザーのみが実績を獲得できるようにする必要があります。実績とその実装方法について詳しくは、Android での実績をご覧ください。

ログイン

ゲームの起動時には、ユーザーのログインを試す必要があります。プレーヤーが連続して何度もログインを拒否した場合、ゲームは要求を止めます。ログインの詳細については、Android でログインを実装するをご覧ください。

保存しています

ゲームのセーブデータを保存するには、Google Play 開発者サービスの保存済みゲームを使用します。ゲームは、デバイス間で一意に識別できるように、ゲームセーブを特定の Google アカウントにバインドする必要があります。つまり、プレーヤーがハンドセットとテレビのどちらを使用している場合でも、ゲームは同じユーザー アカウントからゲームセーブ情報を取得できるようにする必要があります。

また、ゲームの UI に、プレーヤーがローカルデータとクラウドに保存されたデータを削除できるようにするオプションを提供する必要があります。このオプションはゲームの Settings 画面に置くことができます。Play 開発者サービスを使用した保存済みゲームの実装の詳細については、Android の保存済みゲームをご覧ください。

終了

ユーザーがゲームを正常に終了できる、一貫性のある明確な UI 要素を用意してください。この要素は、D-pad ナビゲーション ボタンでアクセスできる必要があります。この方法は、ホームボタンによる終了機能に頼るのではなく、コントローラ間で一貫性がなく、信頼性に欠けるため、終了してください。

ウェブ

Android TV のゲームでウェブ ブラウジングを有効にしない。Android TV はウェブブラウザをサポートしていません。

注: ソーシャル メディア サービスへのログインには、WebView クラスを使用できます。

ネットワーク

ゲームで最適なパフォーマンスを得るには、多くの場合、より大きな帯域幅が必要になります。多くのユーザーは、そのパフォーマンスを実現するために Wi-Fi よりもイーサネットを好んでいます。アプリは Wi-Fi 接続とイーサネット接続の両方を確認する必要があります。アプリがテレビ専用の場合は、モバイルアプリの場合のように 3G/LTE サービスをチェックする必要はありません。