Unity中的输入事件有两种,一种是全局触发,在每一帧的更新时都要进行判断,另一种是监听式触发,监听某个触发条件从而执行之后的逻辑。全局输入适用于人物控制,移动等事件的使用。需要用到Input类,它可以监听键盘,鼠标,手柄,以及移动设备上的Touch事件。由于全局输入没有提供触发事件,需要在Update中通过每一帧的更新去判断是否执行。
1、Input类中的GetKey方法有三种:GetKey()、GetKeyDown()和GetKeyUp()。参数类型为KeyCode,例如Input.GetKey(KeyCode.W)
区别:GetKey会不断监听键盘操作并执行后续逻辑,GetKeyDown只监听按下按键的一次动作,GetKeyUp只监听按键松开的一次动作。
void Update () {
if(Input.GetKeyUp(KeyCode.W))
{
modle.position += Vector3.forward + new Vector3(0f, 0f, 0.1f);
}
if(Input.GetKey(KeyCode.D))
{
modle.position += Vector3.right + new Vector3(0.1f, 0, 0);
}
if (Input.GetKeyDown(KeyCode.S))
{
modle.position += Vector3.back + new Vector3(0, 0, 0.1f);
}
if (Input.GetKey(KeyCode.A))
{
modle.position += Vector3.left + new Vector3(0.1f, 0, 0);
}
}
2、Unity定义了一下中常用的组合键,这些键可以在Editor—>Project Setting—>Input中进行管理。
我们可以通过使用Input.GetAxis("组合键名")函数来获取事先设置的组合键的值。
private float h = 0.0f;
private float v = 0.0f;
void Update(){
h = Input.GetAxis("Horizontal");
v = Input.GetAxis("Vertical");
}
例如:Input.GetAxis("Horizontal")函数,Horizontal的默认按键是A,D或Left,Right。该方法的返回值介于-1和1之间。
若对键盘控制时效性要求较高,可以使用Input.GetAxisRaw("Horizontal")函数,该函数仅返回-1、0、1三个值。
3、自定义Button类实现输入事件
定义一个MyButon类
public class MyButton{
//定义按钮的三种状态
public bool IsPressing = false;
public bool OnPressed = false;
public bool OnReleased = false;
//用两个布尔值标记当前的按钮状态和上一次的状态
private bool curState = false;
private bool lastState = false;
//声明一个方法处理按钮的点击事件
public void Tick(bool input)
{
//Ispressing即为当前的input事件
curState = input;
IsPressing = curState;
//其他状态值置为false
OnPressed = false;
OnReleased = false;
//比较当前状态和上一次的状态
if(curState!=lastState)
{
if(curState == true)
{
//如果当前状态为按压,上一次状态为非按压,则此时按钮处于按压后的状态
OnPressed = true;
}
else
{
OnReleased = true;
}
}
//这一轮的当前按钮状态为下一轮判断的前次状态
lastState = curState;
}
}
MyButton类应该具备按钮的三种状态:IsPressing,OnPressed,OnReleased,声明一个Tick(bool input)函数,参数是一个表示按键是否按下的布尔值。当input=true时,表示按钮正在按下,即isPressing=true。而为了表达“刚刚按下”——OnPressed状态和“刚刚释放”——OnReleased状态,则需要引入两个状态值标记当前状态curState和前次状态lastState。前次状态和当前状态不相等时,表示按钮进行过按压或释放操作,当curState = true;lastState = false;时表示按钮进行过按压操作,当curState = false;lastState = true;则表示按钮进行过释放操作。本轮判断结束前,把curState值赋给lastState,进行下一轮的判断。