在所有外形规格上启用自然输入

Desktop computer with keyboard and mouse. Game is on screen, showing touchscreen inputs for direction control and mouse.
图 1. 键盘、鼠标和触摸屏输入。

Android 设备有多种形状和尺寸。通过让玩家无论身处何处(无论是手机、平板电脑、电脑、电视、汽车还是 XR 头显)都能玩游戏,从而扩展您的游戏覆盖范围。在此您将学习

  • 鼠标鼠标和键盘键盘支持如何将您的游戏带给电脑电脑和 ChromeOSChromeOS 上的玩家,并提高在大屏幕设备上的可玩性。
  • 如何通过集成游戏手柄游戏手柄来满足您最忠实玩家的需求。
  • 如何添加手写笔手写笔支持,以实现移动设备上精确且响应迅速的游戏体验。
  • 如何支持电视控制器电视控制器并解锁玩家拥有的最大屏幕:他们的电视。
  • 设计考量,关于何时在输入方法之间切换。
  • 跨外形规格游戏如何支持玩家的输入偏好
  • 以及更多内容。

自动兼容性

Android 在可能的情况下具有自动非触摸兼容性,例如

  • dispatchTouchEvent/onTouchEvent 即使对于点击或手写笔输入也会响应运动事件。这意味着如果您不检查工具类型,您的触摸处理逻辑应该适用于鼠标和手写笔。
  • 一些未处理的游戏手柄和电视控制器事件会重新作为键盘事件发出。
  • Play 游戏和 ChromeOS 等类似 PC 的外形规格默认通过鼠标点击生成触摸。由于可能没有触摸屏作为备用,这提供了基本的兼容性水平。

  • 鼠标手写笔事件会发送到触摸回调。

  • 未处理的游戏手柄电视控制器事件会重新作为键盘事件发出。

  • Play 游戏和 ChromeOS 等类似 PC 的外形规格默认生成触摸事件而非鼠标事件,以最大化与期望触摸屏输入的游戏的兼容性。

为了获得最佳用户体验,请直接实现对非触摸输入的支持,而不是依赖自动兼容性。

支持所有外形规格

Android 运行在不断增长的设备列表上。无论您的玩家是将手机折叠成大屏幕平板电脑,打开他们的 Android 电视,在 Chromebook 上打开 Android 游戏,还是在等待充电时在车内快速玩游戏,您都可以比以往任何时候都在更多地方、更多显示器上吸引您的玩家。您只需确保您的游戏在玩家所在的地方都可以玩

外形规格 典型默认输入 触摸屏 鼠标和键盘 游戏手柄 手写笔1 五向方向键
手机 触摸屏
大屏幕 触摸屏
电脑2 鼠标和键盘
ChromeOS3 触控板、鼠标和键盘 有时
电视 五向方向键
汽车4
(车载操作系统)
触摸屏
手表5 触摸屏

此表旨在通过突出显示每个外形规格上预期的输入来帮助您优先支持新的输入机制。请记住,您应该

  • 避免只有一个默认输入机制。这样做可能会无意中限制您的非触摸工作的覆盖范围。例如,尽管大多数玩家希望使用鼠标和键盘玩 ChromeOS 游戏,但根据其设备配置文件,有些玩家可能仍然需要触摸屏支持。
  • 避免将输入机制锁定到外形规格。Android 支持各种外围设备,混合设备越来越受欢迎。如果玩家拥有带可拆卸键盘的平板电脑,从手机版本中移除键盘支持可能会让您的游戏感觉不完整。

鼠标输入

玩家最大、最沉浸式的屏幕可能运行 Android,无论是 ChromeOS 笔记本电脑、Android 平板电脑还是 PC。玩家通常希望在这些设备上使用鼠标进行游戏,添加支持可以提高玩家参与度。Android 支持桌面操作系统常见的典型功能,包括

  • 支持左键、右键和中键点击以及额外按钮,如后退前进
  • 滚轮检测
  • 鼠标运动的绝对或相对(也称为指针捕获)报告
  • 定义自定义指针图标的能力

存在针对以下外形规格的特定指南

触控板输入

Android 上的触控板输入捕获与鼠标支持略有不同。当调用 requestPointerCapture() 时,您是在请求对触控板上触摸的原始访问。这意味着您会收到每次触摸的事件,就像您从触摸屏收到多点触控事件一样,只是坐标是在触控板的坐标空间中,而不是显示器的坐标空间中。在此模式下,Android 内置的触控板手势检测和手掌过滤功能会被禁用。例如,如果用户在触控板上移动一根手指,同时将拇指放在左下角准备点击,则由您的游戏决定应使用哪根手指的移动(例如,移动摄像头)。

这意味着带有内置触控板的游戏手柄可以像触摸屏一样用于强大的基于手势的输入。

要确定您的玩家在使用指针捕获时使用的是鼠标还是触控板,请检查 InputDevice#getSources()MotionEvent#getSource() 的源值,以查找 InputDevice.SOURCE_TOUCHPAD

键盘输入

键盘支持几乎在所有 Android 设备上都是通用的。根据您开发的游戏类型,为游戏添加键盘识别功能的优势包括通过提高可访问性来扩大玩家群体,以及使您的游戏更具沉浸感和直观性。

通过键盘支持改善游戏的一些常见方法

  • 必须将多点触控机制映射到非触摸设备的键盘。需要两次或更多次同时触摸的游戏(例如移动和跳跃)通过将这些操作映射到键盘按键来受益,从而提高在大屏幕和非触摸屏幕上的可玩性。
  • 使菜单可以通过键盘导航。为您的菜单和静态游戏元素添加按钮导航(例如箭头键和 Enter)可以使游戏在电视上玩,并提高所有外形规格上的可访问性。
  • 为屏幕操作添加热键。将玩家在屏幕上可以触摸的任何内容映射到键盘操作。快速访问操作,例如在策略游戏中选择单位或在动作游戏中激活库存槽位,可以使玩家沉浸在游戏中。

请记住,尽管 QWERTY 键盘非常普遍,但有许多不同的流行布局,并且在一种布局中是单次按键的某些字符在另一种布局中可能是组合键。

如果您的游戏使用按键的相对位置来执行操作,例如使用 WASD 作为方向键来移动,请使用 InputDevice.getKeyCodeforKeyLocation() 将 QWERTY 键的位置映射到 KeyEvent.getKeyCode() 中的键码。如果玩家的布局发生变化,将调用 onInputDeviceChanged()

当向游戏添加文本输入时,GameActivity 中的 TextInput 提供了一种机制,可以在仍使用游戏内文本渲染引擎的同时可靠地处理 IME 输入、音调符号或其他区域特定布局变体。这避免了直接处理键盘输入或使用离屏 EditText 小部件的许多陷阱。

游戏手柄输入

An image of a typical gamepad. It has a directional pad, four face buttons labelled a, b, x, and y, two analog sticks, and four triggers. There are numbers on the image, but they are not referenced in this page.
图 2. 游戏手柄输入。

Android 正式支持游戏手柄,包括连接和断开事件、触觉支持、高级输入支持(包括陀螺仪)以及(如果可用)灯光颜色等输出支持。

应用开发者可以通过 ViewActivity 回调监听游戏手柄输入,但建议游戏开发者使用 游戏控制器库,该库

  • 用 C++ 编写,以便于集成到您自己的游戏引擎中
  • 将所有游戏手柄功能集中到一个 API 中
  • 消除游戏手柄正面按钮上符号的歧义,因此您的游戏标签可以与玩家的游戏手柄匹配
  • 在某些游戏手柄上按钮是模拟输入,而在另一些游戏手柄上是二进制输入的情况下,统一游戏手柄事件的报告
  • 为较旧的 Android 设备提供对较新游戏手柄的有限向前兼容性

手写笔输入

An image showing a drawing app. Brushes are open showing shapes that can be drawn with the stylus.
图 3. 带有画笔调色板的绘图应用。

Android 在大多数设备上都具有高级手写笔支持,包括压力、方向、倾斜、悬停和手掌检测。手写笔事件会发送到触摸回调以帮助兼容性,但使用手写笔设备进行测试很重要,以防您的引擎逻辑过滤掉这些事件。全面的集成有益于具有小触摸目标或自由形式绘图感觉自然的游戏。

当渲染滞后于手写笔移动时,延迟比被手指阻挡或与屏幕断开连接(如键盘、鼠标或游戏手柄)时更明显。因此,Android 提供了一个低延迟管道,用于渲染笔画,从笔尖移动到屏幕显示,延迟低至 4 毫秒。您的游戏可以通过三种方式利用此功能,让您的游戏感觉与现实世界直接相连

  • Jetpack Ink 库提供了一个方便的工具包,用于向任何 Android 项目添加响应式笔画渲染。
  • 对于无法或不愿依赖 Kotlin 组件进行笔画渲染的游戏,完整的 C++ 源代码可用。这允许开发人员将他们所需的内容直接集成到他们的技术中。
  • 对于需要完全自定义集成的游戏,可以直接在前缓冲区上执行自定义渲染逻辑,以最大化响应性和控制力。

电视控制器

An image of the TV controller for Android. Called out are a D-pad, select button, microphone or assistant button, back button, and home button.
图 4. 电视控制器。

Android TV 设备附带一个包含五向方向键的遥控器,该方向键包括四个基本方向和一个OK按钮。使用 Android 内置小部件系统的应用程序默认支持这些功能,但开发人员必须测试其游戏的自定义小部件以保持在 TV 设备上的兼容性。

有关更多信息,请参阅Android TV 文档

其他考量

为了给您的玩家提供最佳体验,请设计多种形式的输入,并进行即时切换。这样,玩家可以根据当前的游戏模式快速切换不同的输入方法,或者游戏可以轻松地在同一 Android 设备的各种配置之间转换。

考虑到这一点,请注意

  • 检查某种输入的存在性比按外形规格过滤更好。例如,如果您只在 ChromeOS 上启用鼠标和键盘支持,那么拥有可拆卸键盘的平板电脑上的玩家将无法受益于您的额外努力。
  • 除了外形规格之外,还有一些因素会影响最佳输入形式。例如,玩家的无障碍需求可能使得鼠标或触摸屏难以使用或痛苦,而游戏手柄或键盘则是理想选择。
  • 任何支持都比没有支持好。理想情况下,能够即时响应输入变化,但只要玩家能够使用,他们就会欣赏某种支持而不是完全没有。
  • 最佳输入可能会在游戏运行之间发生变化。例如,在移动设备上玩游戏时触摸屏更佳,当手机连接到电视时游戏手柄更佳,而在办公桌前则鼠标和键盘更佳。

如何响应用户输入

典型的手机游戏支持每个设备一个玩家。为了获得最佳效果,游戏会响应所有可能的输入,并根据玩家正在积极使用的输入调整 UI。这样,一个版本的游戏就可以自动适用于所有外形规格,玩家甚至可以混合和匹配输入以满足他们的需求。

通常,开发者希望有一个默认输入方法,并在切换 UI 之前内置延迟。这意味着什么?

  • 由于大多数玩家在触摸屏上玩游戏,因此在启动时显示触摸控件。如果玩家开始使用键盘或游戏手柄玩游戏,并且一段时间不使用触摸屏,则淡出触摸层。
  • 如果玩家正在使用游戏手柄并按下键盘键,则将游戏内提示转换为显示键盘按钮而不是游戏手柄按钮。
  • 当玩家同时使用键盘和游戏手柄时,在将 UI 从一组提示切换到另一组提示之前设置延迟,以避免显示闪烁。
  • 在处理输入时检查输入源类型;键盘键和游戏手柄按钮都会发出按键事件。
  • 尽量不要将输入标记为已处理,除非您的游戏能够处理它。Android 会重新发出一些事件,以便在新外形规格上实现兼容性,例如,将游戏手柄的 A 按钮转换为 OK 按钮。

在清单中注释输入支持

虽然不是必需的,但最好使用清单功能标志注释您处理的输入类型。常见的标志有


  1. 制造商可以为某些设备内置手写笔支持,但没有哪种外形规格能保证支持。绘图板可以插入 Android 设备并显示为手写笔。 

  2. 尽管有些 PC 支持触摸屏和手写笔,但 Google Play 游戏客户端仅响应来自主机操作系统的鼠标事件。为了最大化兼容性,鼠标事件默认在客户端中显示为触摸事件。有关更多信息,请参阅鼠标输入部分。 

  3. ChromeOS 设备通常支持鼠标和键盘,但触摸屏是可选的。许多支持触摸屏的设备也支持手写笔输入。 

  4. Android Automotive OS 指的是内置 Android 的汽车,它可以在没有 Android 手机的情况下运行。此图表指的是 Automotive OS。Android Auto 将手机上的应用投射到汽车上,支持 Android Auto(投射)的设备可能没有触摸屏。 

  5. Wear OS 设备连接性有限。您可以扫描蓝牙外围设备,但操作系统通常无法连接。