制作 TV 游戏

电视屏幕带来了移动游戏新接触的一些注意事项 开发者。这些方面包括:游戏的大尺寸、控制方案,以及所有玩家都可以 同时观看这部分内容

显示

在开发适用于电视屏幕的游戏时,两大要点是设计您的 横向模式,并支持低延迟。

支持横向显示

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

自动低延迟模式

特定的显示屏可以执行图形后期处理。此类后期处理可改善图形质量,但可能会增加延迟时间。支持 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 键进行移动,但在 AZERTY 键盘(A 键和 W 键位于不同位置)上,此功能可能无法正常运行。您可以从 指定您希望位于特定位置的键:

KotlinJava
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)
    }
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 主屏幕上,游戏和常规应用会分开显示。 要让您的游戏显示在游戏列表中,请将 <ph type="x-smartling-placeholder"></ph> android:isGame属性"true" <application> 标记。例如:

<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 账号,这样才能 即使是不同的设备也都能唯一识别:无论玩家使用的是手机还是电视, 游戏应该能够从同一用户账号提取游戏存档信息。

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

退出

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

网络

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

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

网络

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