Unity中的人物控制

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,进行下一轮的判断。

猜你喜欢

转载自blog.csdn.net/Sigure_/article/details/83448825
今日推荐