我正在尝试学习新的Unity输入系统。在以前的Unity输入系统中,
if (Input.GetKeyDown("f"))
//do something when key 'f' is pressed
if (Input.GetKeyDown("g"))
//do something when key 'g' is pressed
if (Input.GetKeyDown("h"))
//do something when key 'h' is pressed
if (Input.GetKeyDown("j"))
//do something when key 'j' is pressed
将沿着f、g、h、j的按键执行任何定义的动作。
在新的Unity输入系统中,有InputAction,我可以定义动作映射、动作和属性。然后,我可以实现如下函数,这些函数可以在播放器对象的检查器下从PlayerInput调用。
public void OnKey_F(InputAction.CallbackContext context)
{
if (context.started)
Debug.Log("Pressed F");
}
public void OnKey_G(InputAction.CallbackContext context)
{
if (context.started)
Debug.Log("Pressed G");
}
public void OnKey_H(InputAction.CallbackContext context)
{
if (context.started)
Debug.Log("Pressed H");
}
public void OnKey_J(InputAction.CallbackContext context)
{
if (context.started)
Debug.Log("Pressed J");
}
在新的Unity输入系统下,这是完成上述功能的正确方法吗?我找到的教程主要是针对WASD运动的,我已经了解了它的工作原理(2d矢量(。然而,我不确定这种情况,它需要多个键来实现多个功能。
有几种方法可以实现这一点,所以很抱歉我仍然没有100%使用此表单,但我想我会分享一个简单的实现,它对我来说很好,可以多次按键,完全绕过大多数检查器的工作。
它从选择播放器输入地图资产开始;生成C#类";按钮被激活并应用。
然后在MonoBehavior脚本中,我们实例化该类,并添加内联回调函数:
PlayerInputClass Inputs;
void Awake(){
Inputs = new PlayerInputClass();
Inputs.Enable();
// Examples. You can add as many as you want.
// You can put the ContextCallback to use
Inputs.Player.Move.performed += ctx => Movement = ctx.ReadValue<Vector2>();
// You can complete ignore it
Inputs.Player.Roll.performed += ctx => _RollInputFlag = true;
// You can define a function to handle the press
Inputs.Player.OtherAction.performed += FunctionThatRuns();
}
我通常选择翻转标志,这样脚本就可以准确地决定何时响应并恢复标志。
注意,这里Player
是动作映射名称,后面的名称是实际的动作名称。这也很好,因为Intellisense将发挥作用并提供帮助。