Unity InputSystem 1.0.1

转载:https://www.jianshu.com/p/0134f9ad01fc

Unity新推出的输入管理系统,主要为了支持VR,多功能输入设备等。可以将输入设备和动作逻辑分离。 通过自定义的映射来配置类关联。

导入组件后,直接点击替换,完成后会要求重启下工程,

创建一个物体,挂上PlayerInput组件,初始化下按默认配置就可以运行起来

创建一个canvas,把生成的EventSystem里的Standard Input Module替换成新的,然后指定给之前创建的PlayerInput组件的UIInputModule属性

其次,所有在NewInputSystem.inputactions这个资源配置里创建的Actions,如果对应绑定的操作触发了,就会有回调,回调函数名就是Action名前加个On,比如触发了Click这个Action,回调方法就是OnClick.参数是个InputValue,下面是一些默认的Action对应的回调以及可以读到的值

public string tag = "default";

    public void OnLook(InputValue value)

    {

        //Call when mouse move

        //var p = value.Get<Vector2>();

        //Debug.LogFormat("[{0}] OnLook:{1}", tag, p);

    }

    public void OnFire()

    {

        Debug.LogFormat("[{0}] OnFire", tag);

    }

    public void OnMove(InputValue value)

    {

        //call when WASD|Arrow... keykown, and keyup

        var p = value.Get<Vector2>();

        Debug.LogFormat("[{0}] OnMove:{1}", tag, p);

    }

    public void OnClick(InputValue value) {

        //when mounse is down, p=1, when up, p=0

        var p = value.Get<float>();



        Debug.LogFormat("[{0}] OnClick:{1}", tag, p);

    }

    public void OnRightClick(InputValue value)

    {

        //when mounse is down, p=1, when up, p=0

        var p = value.Get<float>();

        Debug.LogFormat("[{0}] OnRightClick:{1}", tag, p);

    }

    public void OnMiddleClick(InputValue value)

    {

        //when mounse is down, p=1, when up, p=0

        var p = value.Get<float>();

        Debug.LogFormat("[{0}] OnMiddleClick:{1}", tag, p);

    }

    public void OnScrollWheel(InputValue value)

    {

        var p = value.Get<Vector2>();

        Debug.LogFormat("[{0}] OnScrollWheel:{1}", tag, p);

    }

    public void OnSubmit(InputValue value)

    {

        //when enter is down, value=1, no effect when enter is up

        var p = value.Get<float>();

        Debug.LogFormat("[{0}] OnSubmit:{1}", tag, p);

    }

    public void OnCancel(InputValue value)

    {

        //when ESC is down, value=1, no effect when ESC is up

        var p = value.Get<float>();

        Debug.LogFormat("[{0}] OnCancel:{1}", tag, p);

    }

    public void OnTouch(InputValue value)

    {

        Debug.LogFormat("[{0}] OnTouch:{1}", tag, value);

    }

    public void OnPoint(InputValue value)

    {

        //Call when mouse move

        //var p = value.Get<Vector2>();

        //Debug.LogFormat("[{0}] OnPoint:{1}", tag, p);

    }

    public void OnNavigate(InputValue value)

    {

        //call when WASD|Arrow... keykown, and keyup

        var p = value.Get<Vector2>();

        Debug.LogFormat("[{0}] OnNavigate:{1}", tag, p);

    }

    public void OnTrackedDeviceOrientation(InputValue value)

    {

        var p = value.Get<Vector2>();

        Debug.LogFormat("[{0}] OnTrackedDeviceOrientation:{1}", tag, p);

    }

    public void OnTrackedDevicePosition(InputValue value)

    {

        var p = value.Get<Vector2>();

        Debug.LogFormat("[{0}] OnTrackedDevicePosition:{1}", tag, p);

    }

    public void OnControlsChanged(InputValue value)

    {

        var p = value.Get<Vector2>();

        Debug.LogFormat("[{0}] OnCtrontrolsChanged:{1}", tag, p);

    }

    public void onDeviceRegained(InputValue value)

    {

        var p = value.Get<Vector2>();

        Debug.LogFormat("[{0}] onDeviceRegained:{1}", tag, p);

    }

    public void OnDeviceLost(InputValue value)

    {

        var p = value.Get<Vector2>();

        Debug.LogFormat("[{0}] OnDeviceLost:{1}", tag, p);

    }

关于ActionType

Value默认,主要用于状态连续更改的输入,例如鼠标的移动,手柄的遥感。如果有多个设备绑定这个Action,只会发送其中一个设备(最受控制的)的输入

Button用于每次按下时触发的Action

Pass-Through和Value一样,区别在于如果有多个设备绑定这个Action,会发送所有设备的输入

关于Interactions

Interaction(交互)主要用于一些特殊的输入模式,例如其中的Hold模式,要求控件至少保持的时间。

你可以在Action或者Binding下设置它,如果在Action下设置,那么该Action下的每个Binding都会在达成条件下触发这个Interaction。如果在同一个Action或Binding上绑定多个Interaction,则会按照其顺序进行检测。

Unity自带一个可以使用的基本交互(default Interaction),如果用户没有自定义交互的话,系统默认会使用default Interaction。

下面是几种Interaction介绍:

Default:当Action Type为Value或Button时,当输入设备响应会调用started回调(例如按钮按下,或者鼠标开始拖动),当设备响应中时会调用performed回调(在started后触发,调用一次。若为Value的话,当值发生变化会再次触发,例如遥感,按住之后每次偏移位置都会触发一次),当输入设备结束响应会调用canceled回调(例如按钮松开,或者鼠标停止拖动)。当Action Type为PassThrough的时候,只会调用performed回调。

Press:可以实现类似按钮的操作

Trigger Behavior 

Press Only按下的时候触发started和performed。不触发canceled

Release Only按下的时候触发started,松开的时候触发performed。不触发canceled

Press And Release按下的时候触发started和performed,松开的时候会再次触发started和performed。不触发canceled

Press Point:在Input System中,每个按钮都有对应的浮点值,例如普通的按钮,将会在0(未按下)和1(按下)之间。因此我们可以利用这个值(Press Point)来进行区分,当大于等于这个值则认为按钮按下了。

Hold:适用于需要输入设备保持一段时间的操作。当按钮按下会触发started,若在松开按钮前,按住时间大于等于Hold Time则会触发performed(时间一到就触发),否则触发canceled。

Tap:和Hold相反,需要在一段时间内按下松开来触发。当按钮按下会触发started,若在Max Tap Duriation时间内(小于)松开按钮,触发performed,否则触发canceled。

SlowTap:类似Hold,但是它在按住时间大于等于Max Tap Duriation的时候,并不会立刻触发performed,而是会在松开的时候才触发performed

MultiTap:用作于多次点击,例如双击或者三连击。Tap Count为点击次数,Max Tap Spacing为每次点击之间的间隔(默认值为 2 * Max Tap Duration)。Max Tap Duration为每次点击的持续时间,即按下和松开按钮的这段时间。当每次点击时间小于Max Tap Duration,且点击间隔时间小于Max Tap Spacing,点击Tap Count次,触发performed。

最后,在目前这个版本里一个操作是不能以抢占的方式阻止其他的Action执行的,类似于游戏中监听了点击,ui上也监听了,如果点击ui,同样会触发游戏场景里的点击行为。



作者:NeoSam
链接:https://www.jianshu.com/p/0134f9ad01fc
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值