制作 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_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 支持时,如果您的游戏也可以使用标准电视遥控器(方向键)玩,请将 android:required 属性设置为 "false"。仅当需要游戏控制器才能玩您的游戏时,才将 android:required 设置为 "true"。 设置 android:required="true" 会在 Android TV 版 Google Play 上显示“需要游戏手柄”标志和预安装警告,而不是阻止在 TV 设备上安装。

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

Google Play 游戏服务

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

成就

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

登录

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

正在保存

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

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

退出

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

网页

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

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

网络

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