电视屏幕带来了移动游戏开发者可能不太熟悉的一些注意事项。这些注意事项包括屏幕的大尺寸、控制方案,以及所有玩家同时观看屏幕的事实。
显示
在开发适用于 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 键盘(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
属性设为 "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 服务。