Keyboard
类定义了一个设备,其中的按键控件由 Key
枚举定义。键盘布局对个别按键的位置是无关的,这意味着,例如,A
键总是在 Caps Lock
键的右侧,不管当前活动的键盘布局如何生成 a
字符。
你可以使用键控件的 displayName
属性查询给定按键生成的字符。此属性的值会在操作系统更改键盘布局时自动更新。
你也可以使用控件路径根据生成的字符查找按键。例如,可以通过 Keyboard.current["#(a)"]
查询生成 a
字符的按键。
注意:
键盘通常在同时按下多个键时有硬件限制,某些按键组合可能无法正确注册。例如,某些键盘可能可以正确报告 "QWERT" 键的同时按下,但不能报告 "QWERA" 的同时按下。
目前,新的输入系统不支持屏幕键盘。暂时请使用 UnityEngine.TouchScreenKeyboard
的现有 API。
Unity 平台后端目前不支持区分多个键盘。尽管输入系统支持多个键盘设备,但平台后端通常只报告一个键盘,并将所有键盘输入路由到同一个键盘设备。
可以使用以下方法之一从 Keyboard
中检索按键:
使用按键的访问器属性,例如 Keyboard.spaceKey
。
使用 Keyboard
的索引器和 Key
枚举(例如,keyboard[Key.Space]
)。
Keyboard
类的脚本 API 参考列出了所有按键控件的属性。
有两个特殊的控件 anyKey
和 imeSelected
,它们不直接映射到个别按键。anyKey
是一个合成按钮控件,报告键盘上的任何按键是否被按下,而 imeSelected
报告是否启用了 IME 文本处理。
此外,Keyboard
的索引器和 Key
还有三个表示修饰键组合的合成控件:
控件描述shiftKey当 leftShiftKey
和/或 rightShiftKey
被按下时,此按钮被按下。ctrlKey当 leftCtrlKey
和/或 rightCtrlKey
被按下时,此按钮被按下。altKey当 leftAltKey
和/或 rightAltKey
被按下时,此按钮被按下。
最佳实践是不应该通过将按键对应的字符串连在一起手动转换文本输入。相反,可以监听 Keyboard.onTextInput
,它会逐字符地接收平台报告的输入,包括来自屏幕键盘的输入。
请注意,文本输入 API 不会分配 GC 内存,因为它不会传递完全组合的字符串。
一些书写系统(如某些东亚语言)过于复杂,无法通过键盘上的个别按键表示所有字符。对于这些布局,操作系统实现了输入法编辑器 (IME),允许通过其他方法组合输入字符串,例如通过键入多个按键生成一个字符。
Unity 的 UI 框架支持 IME 文本输入,不需要额外配置。如果你想构建自己的文本输入 UI,可以使用 Keyboard
类通过以下 API 处理来自 IME 的输入:
imeSelected
是一个虚拟输入控件,报告是否启用了 IME 文本处理。
SetIMEEnabled()
方法允许打开或关闭 IME 处理。通常,IME 处理在用户编辑文本时有用,但在使用键盘控制游戏时并不需要。
SetIMECursorPosition()
方法允许你设置 IME 窗口的光标位置,通常用于打开系统窗口以让用户交互编辑文本。
onIMECompositionChange
是一个事件,允许你订阅并接收 IME 组合字符串的所有更新。组合字符串是用户当前使用 IME 编辑的文本,通常在处理文本输入的 UI 中显示该字符串,并在当前文本输入光标位置显示正在编辑的文本(通常有下划线的视觉指示)。
可以使用 Keyboard.keyboardLayout
查询当前的键盘布局名称。布局名称是平台特定的。
应用程序不支持设置键盘布局。
要监控键盘布局的更改,可以订阅 InputSystem.onDeviceChange
并检查 InputDeviceChange.ConfigurationChanged
事件。
要查找与特定显示字符序列对应的按键控件,可以调用 Keyboard.FindKeyOnCurrentKeyboardLayout()
。
// 查找根据当前键盘布局生成 'q' 字符的按键。