Updated on 十一月 24, 2021
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,在代码端打印日志,摸着石头过河。