Unity InputSystem 1.0.1

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,同样会触发游戏场景里的点击行为。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、Unity简介 1. Unity界面 Shift + Space : 放大界面 Scene界面按钮渲染模式2D...
    MYves阅读 8,718评论 0 22
  • Nameobject.Destroy(建议用这个,不会被立刻回收,放在垃圾池里,再同意销毁)Object.Dest...
    alphonseLin阅读 802评论 0 0
  • 1. [C#语言基础]请简述拆箱和装箱。 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何...
    胤醚貔貅阅读 5,007评论 1 28
  • using UnityEngine; using System.Collections; public class...
    胤醚貔貅阅读 3,715评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,968评论 19 139

友情链接更多精彩内容