TV ゲームを作成する

テレビ画面には、モバイルゲーム デベロッパーにとって新しい考慮事項がいくつかあります。これらの領域には、画面の大きさ、操作方法、すべてのプレーヤーが同時に画面を見ているという事実が含まれます。

ディスプレイ

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

横向き表示のサポート

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

自動低遅延モード

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

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

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

入力デバイス

テレビにはタッチ インターフェースがないため、適切な操作方法で、直観的に心地よく使用できるようにすることが重要となります。コントローラの扱いでは、この他にも複数コントローラの追跡や、切断を円滑に処理するなど、注意を払うべき課題があります。ゲームを含めたすべてのテレビアプリで、コントローラの扱いが一貫している必要があります。テレビ コントローラの使用に関する詳細については、テレビ コントローラの管理をご覧ください。ゲーム向けのコントローラの使用に特有の情報については、ゲーム向けのコントローラの扱いをご覧ください。

キーボード配列

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 キーボードを使用しているため、keyUp は KeyEvent.KEYCODE_Z に、keyLeft は KeyEvent.KEYCODE_Q に設定され、keyDown と keyRight はそれぞれ KeyEvent.KEYCODE_S と KeyEvent.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 のサポートを指定する際、ゲームを標準のテレビリモコン(D-pad)でもプレイできる場合は、android:required 属性を "false" に設定します。ゲームのプレイにゲーム コントローラが必要な場合にのみ、android:required を "true" に設定します。android:required="true" を設定すると、Android TV 向け Google Play で「ゲームパッドが必要」バッジとプリインストール警告が表示されます。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 接続とイーサネット接続の両方を確認する必要があります。アプリが TV 専用の場合は、モバイルアプリの場合のように 3G/LTE サービスを確認する必要はありません。