制作 TV 游戏

对于移动游戏 开发者来说,电视屏幕可能会带来一些新的考虑因素。这些因素包括电视屏幕尺寸较大、控制方案以及所有玩家 同时观看。

显示

为电视屏幕开发游戏时,需要注意两个主要事项:将游戏设计为横向显示,并提供低延迟支持。

支持横向显示

电视始终是横向的:您无法将其旋转,也没有纵向模式。请始终将电视游戏设计为以横屏模式显示。

自动低延迟模式

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

在 Android 11 及更高版本中,窗口可以通过请求 最低限度的后处理来请求使用自动低延迟模式或游戏 模式(如果可用)。这对于游戏和视频会议应用尤其有用,因为在这些应用中,低延迟比 获得最佳图形效果更重要。

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

输入设备

电视没有触摸界面,因此,正确设置控件并确保玩家觉得控件直观且易于使用就显得更加重要。处理控制器 还会带来一些其他需要注意的问题,例如跟踪多个 控制器以及妥善处理断开连接的情况。所有电视应用(包括游戏)都应以一致的方式处理 控制器。如需详细了解如何使用电视控制器,请参阅管理电视 控制器;如需了解如何将电视控制器用于游戏,请参阅 处理游戏控制器。

键盘布局

在 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_Z,keyLeft 设置为 KeyEvent.KEYCODE_Q, 而 keyDown 和 keyRight 分别设置为 KeyEvent.KEYCODE_S 和 KeyEvent.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 属性设置为 "false"。只有在玩游戏时需要使用游戏控制器的情况下,才将 android:required 设置为 "true"。 将 android:required="true" 设置为 `"true"` 会在 Google Play for Android TV 上显示“需要游戏手柄” 徽章和预安装警告,而不是 阻止在电视设备上安装。

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

Google Play 游戏服务

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

成就

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

登录

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

正在保存

使用 Google Play 服务的 游戏存档 功能来存储 您的游戏存档。您的游戏应将游戏存档绑定到特定的 Google 账号,以便即使在不同设备上也能可明确识别个人身份:无论玩家使用的是手机还是电视,游戏都应能够从同一用户账号中提取游戏存档信息。

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

退出

您应提供一个一致且明显的界面元素,让用户可以正常退出游戏。此元素应可通过方向键导航按钮访问。请执行此操作,而不是依赖“主屏幕”按钮来提供退出功能,因为该按钮在不同的控制器上不一致且不可靠。

网页

请勿在 Android TV 游戏中启用网页浏览功能。Android TV 不支持网络浏览器。

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

网络

游戏通常需要更大的带宽才能提供最佳性能,许多用户更喜欢使用以太网而不是 Wi-Fi 来提供这种性能。您的应用应同时检查 Wi-Fi 和以太网连接。如果您的应用仅适用于电视,则无需像移动应用那样检查 3G/LTE 服务。