输入
输入允许用户使用设备、触摸或手势来控制您的应用程序。您可以对应用程序内的元素(例如图形用户界面 (GUI) 或用户头像)进行编程,以不同方式响应用户输入。
Unity 支持来自多种输入设备的输入,包括:
- 键盘和鼠标
- 游戏杆
- 控制器
- 触摸屏
- 加速度计或陀螺仪等移动设备的运动感应功能
- VR 和 AR 控制器
一、Input Manager
使用InputManager定义输入轴及其关联操作,如果要编辑它Edit > Project Settings
,选择Input Manager
Input Manager可使用一下物件
- 键指物理键盘上的任何键,例如 W、Shift 键或空格键。
- 游戏手柄
- 虚拟轴被映射到控件(例如按钮或键)。用户激活控件后,该轴会收到 [–1..1] 范围中的某个值。您可以将该值用于您的脚本。
虚拟轴
默认情况下,创建的每个项目都创建了若干输入轴。通过这些轴可以立即在项目中使用键盘、鼠标和游戏杆输入。
要查看有关这些轴的更多信息,请打开 Input Manager 窗口,然后单击任何轴名称旁边的箭头以展开其属性。
每个输入轴具有以下属性:
属性 | 功能 |
---|---|
name | 轴名称。使用此名称可以通过脚本来访问轴。 |
Descriptive Name, Descriptive Negative Name | 这些值已弃用,不起作用。以前在启动时会在 Rebind Controls 屏幕上为用户显示这些值,但该屏幕也已弃用。 |
Negative Button, Positive Button | 用于分别沿负向和正向推动轴的控件。这些控件可以是键盘上的键,也可以是游戏杆或鼠标上的按钮。 |
Alt Negative Button, Alt Positive Button | 用于分别沿负向和正向推动轴的备用控件。 |
Gravity | 不存在输入时,轴下降到中性点的速度(以单位/秒表示)。 |
Dead | 在应用程序对移动操作进行记录之前,用户需要移动模拟摇杆的距离。在运行时,所有模拟设备在该范围内的输入将被视为 null。 |
Sensitivity | 轴向目标值移动的速度(以单位/秒表示)。仅用于数字设备。 |
Snap | 如果启用此属性,按下对应于反方向的按钮时,轴值将重置为零。 |
类型 | 这是控制此轴的输入类型。 |
Axis | 这是用于控制此轴的连接设备的轴。 |
JoyNum | 这是控制此轴的连接游戏杆。可以选择特定游戏杆,或查询所有游戏杆的输入。 |
轴值可能为:
- 对于游戏杆和键盘输入,–1 到 1 之间的值。这些轴的中性位置为 0。某些类型的控件(例如键盘上的按钮)对输入强度不敏感,因此它们不能产生 –1、0 或 1 以外的值。
- 对于鼠标输入,鼠标增量(鼠标在最后一帧中移动的程度)。用户快速移动鼠标时,鼠标输入轴的这些值可能大于 1 或小于 –1。
添加、删除和复制虚拟轴
要添加虚拟轴,请增加 Size
字段中的数值。这样就会在列表底部创建一个新轴。新轴将复制列表中前一个轴的属性。
要删除虚拟轴,可执行以下操作之一:
减小 Size
字段中的数值。这样将删除列表中的最后一个轴。
右键单击任何轴,然后选择 Delete Array Element
。
注意:无法撤消此操作。
要复制虚拟轴,请右键单击该轴并选择 Duplicate Array Element
。
将虚拟轴映射到控件
要将键或按钮映射到轴,请在 Input Manager 中的 Positive Button 或 Negative 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");
在脚本中使用虚拟轴
要通过脚本访问虚拟轴,可以使用轴名称。
例如,要查询水平轴的当前值并将其存储在变量中,可以使用 Input.GetAxis,如下所示:
float horizontalInput = Input.GetAxis ("Horizontal");
对于描述事件而非移动操作的轴(例如,游戏中武器开火),请改用 Input.GetButtonDown。
如果两个或多个轴同名,查询将返回具有最大绝对值的轴。这样就可以将多个输入设备分配给一个轴名称。
例如,可以创建两个名为 Horizontal 的轴,并将一个轴分配给键盘输入,将另一个轴分配给游戏杆输入。如果用户正在使用游戏杆,则输入来自游戏杆,键盘输入为 null。否则,输入来自键盘,游戏杆输入为 null。因此,可以编写一个脚本来涵盖多个控制器的输入。
示例
可以使用 Horizontal 和 Vertical 轴的输入以及 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 可确保游戏对象在每一帧匀速移动。
Orz