制作 TV 游戏

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

显示

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

支持横向显示

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

自动低延迟模式

某些显示屏可以执行图形后期处理。这种后期处理可改善图形 但可能会增加延迟时间支持 HDMI 2.1 的新型显示器可自动降低 延迟模式 (ALLM),通过关闭此后处理来最大限度地缩短延迟时间。对于 ALLM,请参阅 HDMI 2.1 规范。其他 显示屏可能支持具有类似行为的游戏模式

在 Android 11 及更高版本中,窗口可以请求自动低延迟模式或玩游戏 模式(如果可用)通过请求尽可能减少后期处理来使用。尤其是 对游戏和视频会议应用很有用,因为低延迟时间比 尽可能呈现最佳图形

要启用或停用最低限度的后期处理,请调用 Window.setPreferMinimalPostProcessing(), 或将窗口的 preferMinimalPostProcessing 属性设为 true。并非所有显示屏都支持最低限度的后期处理;以了解 特定显示屏支持该功能,则调用 Display.isMinimalPostProcessingSupported() 方法结合使用。

输入设备

电视没有触摸界面,因此正确控制控件并使 确保玩家觉得它们既直观又有趣。处理控制器 还引入了一些需要注意的其他问题,例如跟踪 控制器和处理会正常断开连接。包括游戏在内的所有电视应用都应 控制器的一致性。请参阅管理电视 控制器,详细了解如何使用 TV 控制器和 处理游戏控制器以获得特定的 有关使用电视控制器管理游戏的信息。

键盘布局

在 Android 13(API 级别 33)及更高版本中,您可以使用 getKeyCodeForKeyLocation()。 例如,您的游戏支持使用 WASD 键进行移动,但可能无法在 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 主屏幕上,游戏和常规应用会分开显示。 要让您的游戏显示在游戏列表中,请将 <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 类登录 社交媒体服务

网络

游戏通常需要更大的带宽才能提供最佳性能,许多用户更喜欢 从以太网到 Wi-Fi 的传输性能。您的应用应同时检查 Wi-Fi 和以太网 连接。如果您的应用仅适用于电视,则无需像之前那样检查 3G/LTE 服务 。