Unity InputSystem学习笔记

只是了解了皮毛,记录一下。

引入包

Windows -> Package Manager -> Input System引入包。

创建按键 – Action映射

对player Add Component -> Player Input,Create Actions创建input action文件。在input action文件内创建按键 – Action的映射。

按键可以是键盘、手柄、鼠标、屏幕点击等,在此对输入差异做了整理,代码端只会收到Action,而不必关注是什么输入设备输入的。

可以创建Button、Value等类型。如果是Button类型,则不会传递值,按下键则出发回调方法;如果是Value类型,可以设置传递的值的类型,比如float、Vector2等;例如移动就是Vector2类型,键盘或手柄等设备方向键传过来的值是个二维数组。Xbox手柄的LT、RT键是带有梯度的,可以设为传float值,根据不同的按压深浅,传递的值在0 – 1.0之间。

代码端

代码端实现创建的Action方法,方法名是OnXxx,如果是Value类型的,参数则是InputValue,可以通过inputValue.Get<T>()获取参数值。

更新—-

上述是在Player Input中Behavior选择Send Messages情况下,经过这段时间摸索,选择Invoke Unity Events更好一些。

点击Events -> Player,可以看到在input action中创建的事件,在此都有显示。点击+,选择Runtime,下面的文件将接收控制的GameObject拖入,如果GameObject下有Script,则在右侧可以选择Script中的方法。

具体实现可以参考官方Demo中的Player Input。

如何多手柄控制?

例如本地游戏,键盘控制1p,手柄控制2p。

是一个值得深入研究的问题。从有限的大致了解来看,似乎可以通过PlayerInputManager的Joining来实现,待后续进一步研究。

长按蓄力

在input action文件内创建Button类型,Interactions创建Press,Trigger Behavior选择Release Only。

在代码段:

    public void OnFire(InputAction.CallbackContext context)
    {
        //Debug.Log("OnFire:" + context.ToString());
        switch (context.phase)
        {
            case InputActionPhase.Performed:
                Fire();
                break;

            case InputActionPhase.Started:
                m_Fired = false;
                m_Charging = true;
                break;
            case InputActionPhase.Canceled:
                break;
        }
    }

可以再input action内选择不同的Interactions、Trigger Behavior,在代码端打印日志,摸着石头过河。

发表评论

电子邮件地址不会被公开。 必填项已用*标注