TV ゲームを作成する

テレビ画面では、モバイルゲーム開発者にはなじみがないと思われる多くの点に考慮しなければなりません。画面が大きいこと、操作方法、全プレーヤーが同時に見ているといった点です。

ディスプレイ

テレビ画面向けのゲーム開発で主に気を付けるべき点は、横向きの画面用にゲームを設計する必要がある点と、低レイテンシをサポートする必要がある点の 2 つです。

横向き表示のサポート

テレビは常に横向きで、回転させることはできず、縦向きにはなりません。テレビゲームは、常に横向きモードの画面で設計してください。

自動低遅延モード

一部のディスプレイでは、グラフィックを後処理することがあります。この後処理はグラフィックの品質を向上させますが、レイテンシが増大することがあります。HDMI 2.1 に対応している新型ディスプレイには、「自動低レイテンシ モード」(ALLM)があり、この後処理をオフに切り替えることでレイテンシを最小限に抑えます。ALLM について詳しくは、HDMI 2.1 仕様をご覧ください。他のディスプレイでは、同様の動作のゲームモードがサポートされている場合があります。

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

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

入力デバイス

テレビにはタッチ インターフェースがないため、適切な操作方法で、直観的に心地よく使用できるようにすることが重要となります。コントローラを扱うにあたって、複数コントローラの追跡や、切断を円滑に処理するなど、注意を払うべき課題があります。ゲームを含めたすべてのテレビアプリで、コントローラの扱いが一貫している必要があります。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_Z に、keyLeftKeyEvent.KEYCODE_Q に、keyDownkeyRight はそれぞれ 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" に設定しないでください。そのように設定すると、ユーザーがそのアプリをテレビデバイスにインストールできなくなります。

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

Google Play ゲームサービス

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

実績

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

ログイン

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

保存

ゲームの保存については、Google Play 開発者サービスの保存済みゲームをご覧ください。ゲームの保存は、異なるデバイス間でも一意に識別できるように、特定の Google アカウントに結び付けて行う必要があります。プレーヤーが使用しているのがハンドセットかテレビかにかかわらず、保存済みゲーム情報を同じユーザー アカウントから取得できる必要があります。

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

終了

ユーザーがゲームを正常に終了できる、一貫性のある明確な UI 要素を用意してください。この要素は、D-pad ナビゲーション ボタンで利用できる必要があります。このようにすることで、終了する際にホームボタンにだけ依存しないようにしてください。異なるコントローラ間での一貫性がなくなり、信頼性が損なわれるためです。

ウェブ

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

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

ネットワーク

ゲームでは、最高のパフォーマンスを提供するためにより広い帯域幅を必要とすることが多く、ユーザーの多くは最高のパフォーマンスを得るために WiFi よりもイーサネットを好みます。アプリでは、WiFi 接続とイーサネット接続の両方を確認する必要があります。テレビ専用のアプリの場合、モバイルアプリの場合のように 3G/LTE サービスを確認する必要はありません。