|
Unity的Input(输入)机制允许用户使用设备(device),触摸(touch)或手势(gestures)等来控制你的应用程序。你可以编写代码实现GUI等应用内的元素如何响应用户的输入。
Unity支持多种输入设备的输入,包括:
- 键盘和鼠标(Keyboards and mice)
- 操纵杆(Joysticks)
- 控制器(Controllers)
- 触摸屏(Touch screens)
- 移动设备的运动传感器,如:加速器和陀螺仪( accelerometers, gyroscopes)
- VR和AR的控制器
Unity通过两个独立的系统来支持输入(input):
- Input Manager 是Unity平台的核心部分之一,默认就可以使用的。
- Input System 是一个package,需要通过Package Manager安装后才能使用。它要求.NET 4 runtime,不能在老的.NET 3.5 runtime下工作。
注意:
在Unity 2020.1中,Input System仍然处于预览状态,因此它还不能用于生成项目,且其目前已有的某些特性将来可能会发生变化。
1 Input Manager
Input Manager窗口允许为你的项目定义input axes(输入轴)以及它们关联的动作。打开Input Manager窗口的方法:Edit>Project Settings,然后选择Input类别 (注: 在Unity 2019.3.4f1下要选择Input Manager类别)。
Input Manager使用以下类型的控件:
- Key 指的是物理键盘上的任意键,如: W, Shift, 或者空格键。、
- Button 指的是任意物理控制器(如:手柄,gamepads)的任意按钮,如Xbox One控制器的X按钮。
- 一个virtual axis(虚轴,axis的复数为axes)被映射成为一个控件(control),如:按钮或按键。当用户激活该控件时,对应的虚轴会收到一个范围在[-1..1]的值。你可以在脚本中使用这个值。
1.1 Virtual axes
你创建的每一个项目默认都会有一些输入轴(input axes)。这些轴使得你可以在项目中直接使用键盘、鼠标、操作杆。你可以在Input Manager窗口中看到更多关于这些输入轴的信息。
每一个输入轴有下面这些属性:
轴(axis)的值:
- 对于操纵轴和键盘输入,axis的值在-1到1之间。这些轴的中性位置为0。一些输入类型,如:按钮和键盘,对输入强度(intensity)不敏感的,因此他们的值只能是-1,0或1。
- 对于鼠标输入,axis的值可以是Mouse delta(即上一帧,鼠标移动的距离)。因此当用户快速移动鼠标时,鼠标输入的值可能比1大或者比-1小。
1.2 添加、移除和复制虚轴
为了添加一个虚轴,需要增大Input Manager下的Size属性的值。这会在轴列表的底部创建一个新的轴。新的轴会复制前一个轴的属性。
为了移除一个虚轴,你可以:
- 减小Size的值,这为移除列表中最后一个虚轴。
- 右击任意一个虚轴,选择Delete Array Element。
注意: 这个动作是无法撤消的。
为了复制一个虚轴,右击它,选择Duplicate Array Element。
1.3 Mapping virtual axes controls
为了把一个键盘按键或鼠标按钮映射到一个虚轴,只需要在Input Manager中对应虚轴的Positive Button或Negative Button属性处,输入这些按键或按钮的名字即可。
按键名字遵守以下规则:
鼠标按钮的名字: mouse 0, mouse 1, mouse 2等。
操纵杆按钮命名规则:
你可以使用Input.GetKey函数为查询某个按键或按钮的输入,例如:
Input.GetKey("a");
对于键盘输入,也可以在脚本中使用KeyCode枚举来访问,举例:
using UnityEngine;
public class KeyCodeExample : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Debug.Log("Space key was pressed.");
}
if (Input.GetKeyUp(KeyCode.Space))
{
Debug.Log("Space key was released.");
}
}
}
1.4 在脚本中使用虚轴
你可以利用虚轴的名称在脚本中访问虚轴。
例如,为了查询水平轴(Horizontal axis,一般是用键盘的a,d 以及左右箭头来控制)的值,你可以像这样使用Input.GetAxis:
float horizontalInput = Input.GetAxis ("Horizontal");
对于那些描述一个事件(event)而不是一个移动(movent)的轴(例如,游戏中的开火键firing),请使用Input.GetButtonDown:
如果两个或多个轴具有相同的名字,则查询返回具有最大绝对值的轴。这使得多个输入设备可以具有同一个名字。
例如,你可以创建两个虚轴,它们的名字都为Horizontal,把其中一个虚轴赋给键盘输入,另一个赋给操纵杆输入。如果用户正在使用操纵杆,则输入来自操纵杆,而键盘输入为null。反之亦然。这样你就可以写一个脚本来覆盖来自多个控制器的所有输入了
玩PC游戏时,有时候会同时插着手柄、键盘和鼠标,三者可以无缝切换。
例子
你可以利用来自Horizontal和Vertical轴的输入和 transform.Translate方法来在XZ平面移动一个GameObject。创建一个脚本,把它的update()方法替换如下,并把这个脚本挂到需要被移动的GameObject上面。
float moveSpeed = 10;
//Define the speed at which the object moves.
float horizontalInput = Input.GetAxis("Horizontal");
//Get the value of the Horizontal input axis.
float verticalInput = Input.GetAxis("Vertical");
//Get the value of the Vertical input axis.
transform.Translate(new Vector3(horizontalInput, 0, verticalInput) * moveSpeed * Time.deltaTime);
//Move the object to XYZ coordinates defined as horizontalInput, 0, and verticalInput respectively.
Time.deltaTime表示自上一帧后经过的时间。用Time.deltaTime乘以速度变量moveSpeed可以保证每帧物体以恒定的速度移动。
想想有些老旧的机器渲染一帧花费的时间较长,则该帧内它移动的距离就长;有些高端机器渲染一帧花费的时间较短,则该帧内它移动的距离就短。
References:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|