电视屏幕呈现了一些移动游戏开发者可能不熟悉的问题。这些方面包括其大尺寸、控制方案以及所有玩家同时观看的事实。
显示
为电视屏幕开发游戏时,要记住的两件主要事情是:将您的游戏设计为横向,并提供低延迟支持。
支持横向显示
电视始终是横向的:您无法转动它,也没有竖向模式。始终将您的电视游戏设计为在横向模式下显示。
自动低延迟模式
某些显示器可以执行图形后处理。这种后处理可以提高图形质量,但会增加延迟。支持 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
属性设置为 "true"
。如果您这样做,用户将无法在 TV 设备上安装您的应用。
有关清单条目的更多信息,请参阅应用清单。
Google Play 游戏服务
如果您的游戏集成了 Google Play 游戏服务,您应该牢记一些与成就、登录和保存游戏相关的注意事项。
成就
您的游戏应至少包含五项(可获得)成就。只有通过受支持的输入设备控制游戏的用户才能获得成就。有关成就及其实现方式的更多信息,请参阅 Android 中的成就。
登录
您的游戏应在启动时尝试让用户登录。如果玩家连续多次拒绝登录,您的游戏应停止请求。在 Android 上实现登录中了解有关登录的更多信息。
保存
使用 Google Play 服务保存游戏来存储您的游戏存档。您的游戏应将游戏存档绑定到特定的 Google 帐户,以便即使在不同设备上也能唯一识别:无论玩家使用的是手机还是电视,游戏都应该能够从同一个用户帐户中获取游戏存档信息。
您还应在游戏的用户界面中提供一个选项,允许玩家删除本地和云端存储的数据。您可以将该选项放在游戏的设置
屏幕中。有关使用 Play 服务实现保存游戏的具体信息,请参阅Android 中的保存游戏。
退出
提供一个一致且明显的界面元素,让用户可以优雅地退出游戏。此元素应可通过方向键导航按钮访问。请这样做,而不是依赖 Home 按钮提供退出,因为这在不同的控制器上既不一致也不可靠。
网络
不要在 Android TV 游戏中启用网页浏览。Android TV 不支持网页浏览器。
注意:您可以使用 WebView
类登录社交媒体服务。
网络
游戏通常需要更大的带宽才能提供最佳性能,许多用户更喜欢以太网而不是 WiFi 来提供这种性能。您的应用应检查 WiFi 和以太网连接。如果您的应用仅用于电视,则无需像移动应用那样检查 3G/LTE 服务。