转载: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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。