Version: 2021.3
输入
移动设备输入

Input Manager

The Input Manager window allows you to define input axes and their associated actions for your Project. To access it, from Unity’s main menu, go to Edit > Project Settings, then select Input Manager from the navigation on the right.

Input Manager 使用以下类型的控件:

  • 指物理键盘上的任何键,例如 W、Shift 键或空格键。
  • Button refers to any button on a physical controller (for example, gamepads), such as the X button on a remote control.
  • 虚拟轴被映射到控件(例如按钮或键)。用户激活控件后,该轴会收到 [–1..1] 范围中的某个值。您可以将该值用于您的脚本。

Physical keys

The Physical keys option allows you to map key codes to the physical keyboard layout, rather than to the language-specific layout that may vary between users in different regions.

For example, on some keyboards the first row of letters reads “QWERTY”, and on others it reads “AZERTY”. This means if you scripted specific controls to use the well known “WASD” keys for movement, they would not be in the correct physical arrangement (like the arrow-key arrangement) on an AZERTY-layout keyboard.

With Physical Keys enabled, Unity uses a generic ANSI/ISO “Qwerty” layout to represent the physical location of the keys regardless of the user’s actual layout. This means if you specify the “Q” key, it will always be the left-most letter on the first row of letter keys, even if the user’s keyboard has a different letter in that position.

Note, you should not read key input for in-game text input, because this will not allow users to enter non-Latin characters. Instead, use Input.compositionString.

虚拟轴

默认情况下,创建的每个项目都创建了若干输入轴。通过这些轴可以立即在项目中使用键盘、鼠标和游戏杆输入。

要查看有关这些轴的更多信息,请打开 Input Manager 窗口,然后单击任何轴名称旁边的箭头以展开其属性。

每个输入轴具有以下属性:

属性 功能
名称 轴名称。使用此名称可以通过脚本来访问轴。
Descriptive Name, Descriptive Negative Name 这些值已弃用,不起作用。以前在启动时会在 Rebind Controls 屏幕上为用户显示这些值,但该屏幕也已弃用。
Negative Button, Positive Button 用于分别沿负向和正向推动轴的控件。这些控件可以是键盘上的键,也可以是游戏杆或鼠标上的按钮。
Alt Negative Button, Alt Positive Button 用于分别沿负向和正向推动轴的备用控件。
Gravity 不存在输入时,轴下降到中性点的速度(以单位/秒表示)。
Dead 在应用程序对移动操作进行记录之前,用户需要移动模拟摇杆的距离。在运行时,所有模拟设备在该范围内的输入将被视为 null。
Sensitivity 轴向目标值移动的速度(以单位/秒表示)。仅用于数字设备。
Snap 如果启用此属性,按下对应于反方向的按钮时,轴值将重置为零。
类型 这是控制此轴的输入类型。从以下值中进行选择:

- 键或鼠标按钮 (Key or Mouse button)
- 鼠标移动 (Mouse Movement)
- 游戏杆轴 (Joystick Axis)
Axis 这是用于控制此轴的连接设备的轴。
JoyNum 这是控制此轴的连接游戏杆。可以选择特定游戏杆,或查询所有游戏杆的输入。

轴值可能为:

  • 对于游戏杆和键盘输入,–1 到 1 之间的值。这些轴的中性位置为 0。某些类型的控件(例如键盘上的按钮)对输入强度不敏感,因此它们不能产生 –1、0 或 1 以外的值。
  • 对于鼠标输入,鼠标增量(鼠标在最后一帧中移动的程度)。用户快速移动鼠标时,鼠标输入轴的这些值可能大于 1 或小于 –1。

添加、删除和复制虚拟轴

要添加虚拟轴,请增加 Size 字段中的数值。这样就会在列表底部创建一个新轴。新轴将复制列表中前一个轴的属性。

要删除虚拟轴,可执行以下操作之一:

  • 减小 Size 字段中的数值。这样将删除列表中的最后一个轴。
  • 右键单击任何轴,然后选择 Delete Array Element
    注意:无法撤消此操作。

要复制虚拟轴,请右键单击该轴并选择 Duplicate Array Element

将虚拟轴映射到控件

要将键或按钮映射到轴,请在 Input Manager 中的 Positive ButtonNegative Button 属性中输入其名称。

键名称遵循以下命名约定:

键系列 命名约定
字母键 a, b, c
数字键 1, 2, 3
箭头键 up, down, left, right
小键盘按键 [1], [2], [3], [+], [equals]
修饰键 right shift, left shift, right ctrl, left ctrl, right alt, left alt, right cmd, left cmd
特殊键 backspace, tab, return, escape, space, delete, enter, insert, home, end, page up, page down
功能键 f1, f2, f3

将鼠标按钮命名为:mouse 0、mouse 1、mouse 2,以此类推。

游戏杆按钮遵循以下命名约定:

按钮原点 命名约定
任何游戏杆上的一个特定按钮 joystick button 0, joystick button 1, joystick button 2
一个特定游戏杆上的一个特定按钮 joystick 1 button 0, joystick 1 button 1, joystick 2 button 0

还可以使用 Input.GetKey 和上文指定的命名约定来查询特定键或按钮的输入。例如:

Input.GetKey("a");

访问键的另一方法是使用 KeyCode 枚举。

在脚本中使用虚拟轴

要通过脚本访问虚拟轴,可以使用轴名称。

例如,要查询水平轴的当前值并将其存储在变量中,可以使用 Input.GetAxis,如下所示:

float horizontalInput = Input.GetAxis ("Horizontal");

对于描述事件而非移动操作的轴(例如,游戏中武器开火),请改用 Input.GetButtonDown

如果两个或多个轴同名,查询将返回具有最大绝对值的轴。这样就可以将多个输入设备分配给一个轴名称。

例如,可以创建两个名为 Horizontal 的轴,并将一个轴分配给键盘输入,将另一个轴分配给游戏杆输入。如果用户正在使用游戏杆,则输入来自游戏杆,键盘输入为 null。否则,输入来自键盘,游戏杆输入为 null。因此,可以编写一个脚本来涵盖多个控制器的输入。

示例

可以使用 HorizontalVertical 轴的输入以及 transform.Translate 方法来移动 XZ 空间中的游戏对象(前移、后移、左移或右移)。在附加到待移动游戏对象的脚本上,将以下代码添加到脚本的 update() 方法中:

float moveSpeed = 10;
//定义对象移动的速度。

float horizontalInput = Input.GetAxis("Horizontal");
//获取水平输入轴的数值。

float verticalInput = Input.GetAxis("Vertical");
//获取垂直输入轴的数值。

transform.Translate(new Vector3(horizontalInput, verticalInput, 0) * moveSpeed * Time.deltaTime);
//将对象移动到 XYZ 坐标,分别定义为 horizontalInput、0 以及 verticalInput。

Time.deltaTime 表示自上一帧以来经过的时间。将 moveSpeed 变量乘以 Time.deltaTime 可确保游戏对象在每一帧匀速移动。

输入
移动设备输入