制作 TV 游戏

电视屏幕带来了一些移动游戏开发者可能不太熟悉的一些注意事项。这些注意事项包括屏幕的大尺寸、控制方案,以及所有玩家 同时观看屏幕的事实。

显示

在开发适用于 TV 屏幕的游戏时,有两个要点需要注意,一个是针对横向屏幕方向设计游戏,另一个是提供对低延迟的支持。

支持横向显示

TV 总是横着摆放:您不能转动它,因而没有纵向显示。因此,应始终将 TV 游戏设计为以横屏模式显示。

自动低延迟模式

特定的显示屏可以执行图形后期处理。这种后期处理可以提高图形 质量,但可能会增加延迟。支持 HDMI 2.1 的新款显示屏具有自动低 延时模式ALLM),该模式可以通过关闭后期处理来最大限度地缩短延时。如需详细了解 ALLM,请参阅 HDMI 2.1 规范。其他 显示屏可能支持具有类似行为的游戏模式

在 Android 11 及更高版本中,窗口可以通过请求 最低限度的后期处理来请求使用自动低延时模式或游戏 模式(如果可用)。这对于游戏和视频会议应用特别有用,因为对于这些应用而言,低延时的重要性要高于 拥有最佳的图形质量。

如需启用或停用最低限度的后期处理,请调用 Window.setPreferMinimalPostProcessing(), 或将窗口的 preferMinimalPostProcessing 属性设置为 true。并非所有的显示屏都支持最低限度的后期处理;要了解某个显示屏是否支持该功能,可调用 Display.isMinimalPostProcessingSupported() 方法。

输入设备

TV 没有轻触界面,因此正确设置控件并确保玩家觉得它们使用起来既直观又有趣显得尤为重要。处理控制器 还引入了需要注意的一些其他问题,如跟踪多个 控制器以及妥善处理断开连接。所有 TV 应用(包括游戏)都应以一致的方式处理 控制器。如需详细了解如何使用 TV 控制器,请阅读管理 TV 控制器;如需详细了解如何使用 TV 控制器控制游戏,请阅读处理游戏控制器

键盘布局

在 Android 13(API 级别 33)及更高版本中,您可以使用 getKeyCodeForKeyLocation()确定键盘布局。 例如,您的游戏支持使用 WASD 键进行移动,但在 AZERTY 键盘上,这可能无法正常运行,因为 AZERTY 键盘上的 A 键和 W 键位于不同的位置。您可以获取您希望在特定位置显示的键的键代码:

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_ZkeyLeft 设置为 KeyEvent.KEYCODE_Q, 而 keyDownkeyRight 分别设置为 KeyEvent.KEYCODE_SKeyEvent.KEYCODE_D。现在,您可以为这些 键代码创建按键事件处理程序,并实现预期行为。

清单

您应在 Android 清单中为游戏添加一些特殊条目。

在主屏幕上显示您的游戏

在 Android TV 主屏幕中,游戏会显示在单独的行内,与常规应用分隔开来。 使您的游戏出现在游戏列表中,请在应用清单的 <application> 标记中将 android:isGame 属性设为 "true"。例如:

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

声明对游戏控制器的支持

TV 设备的用户可能无法使用或激活游戏控制器。为了正确 告知用户您的游戏支持游戏控制器,您必须在 应用清单中添加以下条目:

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

注意 :指定 android:hardware:gamepad 支持时,请勿将 android:required 属性设置为 "true"。如果您这样做,用户将无法在 TV 设备上安装您的应用。

如需详细了解这些清单条目,请参阅 应用清单

Google Play 游戏服务

如果您的游戏集成了 Google Play 游戏服务, 您应记住与成就、登录和存档游戏有关的一些注意事项。

成就

游戏应至少包含五项(可赢得的)成就。只有通过受支持的输入设备控制游戏的用户才能赢得成就 。如需详细了解 成就以及如何实现成就,请参阅 Android 平台中的成就

登录

游戏应尝试在启动时提示用户登录。如果玩家连续几次拒绝登录,游戏应停止询问。如需详细了解登录,请参阅在 Android 设备上实现登录

正在保存

使用 Google Play 服务 游戏存档 来存储 游戏存档。您的游戏应将游戏存档绑定到特定的 Google 账号,这样即使在不同的设备上也能 唯一识别:无论玩家使用的是手机还是 TV,游戏都应能够从同一用户账号提取游戏存档信息。

您还应在游戏的界面中提供一个选项,让玩家能够删除在本地存储和 云端存储的数据。您可以将该选项放在游戏的Settings屏幕中。如需详细了解如何使用 Play 服务实现游戏存档,请参阅 Android 平台中的游戏存档

退出

您应提供一个一致且明显的界面元素,让用户可以正常退出游戏。此元素应该可通过方向键导航按钮进行访问。您应采用这种方法,而不是依靠主屏幕按钮来提供退出机制,因为后者在不同控制器之间既不一致又不可靠。

网络

请不要在 Android TV 游戏中启用网络浏览。Android TV 不支持网络浏览器。

注意:您可以使用 WebView 类登录 社交媒体服务。

网络

游戏往往需要较大的带宽来提供最佳性能,并且许多用户更喜欢以太网而不是 WLAN 来提供这种性能。您的应用应同时检查是否有 WLAN 和以太网连接。如果您的应用仅用于 TV,就无需像移动应用一样检查 3G/LTE 服务。