前面一篇大致简单的介绍了下Input System,并且通过官方的 SimpleDemo_UsingPlayerInput 来了解了PlayerInput组件的使用。接下来让我们通过其他几个Demo来了解下Input System的其他几种使用方法。
SimpleDemo_UsingActionAsset Demo
这个Demo,相比SimpleDemo_UsingPlayerInput,会发现在这个Demo中并没有使用到Player Input组件,而在SimpleController_UsingActionAsset.cs中,多了一个SimpleControls的类。
我们来看下SimpleControls内部,首先有个Json格式的字符串,大致看下内容会发现其就是SimpleDemo_UsingPlayerInput中PlayerInput通过Create Action生成的SimpleControls.inputactions文件的内容。再往后便是声明inputactions文件中配置的Actions等等。
使用起来也不需要在Player Input组件中去绑定事件,只需要使用代码来绑定即可,例如:
m_Controls = new SimpleControls();
m_Controls.gameplay.fire.performed +=
ctx =>
{
//to something
};
m_Controls.gameplay.fire.started +=
ctx =>
{
//to something
};
而要读取输入设备的值也很方便,例如
public void Update()
{
var look = m_Controls.gameplay.look.ReadValue<Vector2>();
var move = m_Controls.gameplay.move.ReadValue<Vector2>();
//todo something
}
需要注意的是我们必须手动的设置其Enable和Disable,来启动或关闭InputAction
public void OnEnable()
{
m_Controls.Enable();
}
public void OnDisable()
{
m_Controls.Disable();
}
那么这个SimpleControls.cs脚本是如何生成的呢,我们点击SimpleControls.inputactions,在Inspector面板中,我们可以发现可以将其生成C#文件,设置好参数后点击Apply即可生成对应的C#文件。
SimpleDemo_UsingActions Demo
这个Demo中同样没有使用到Player Input组件,而是在脚本中添加了几个InputAction事件。在Inspector面板中,我们可以看见这几个InputAction的设置。
可以看见demo中绑定的都是手柄GamePad的输入,我们可以在Fire Action中点击 + 号,选择Add Binding,然后绑定鼠标左键。这样运行的时候可以通过点击左键来触发开火功能。
具体的代码实现也很简单,通过给InputAction绑定事件,以及通过ReadValue方法来读取值即可。
除了InputAction外,我们还可以在MonoBehaviour中添加InputActionMap,同样的,和上个Demo一样,在MonoBehaviour 中添加的Action,InputActionMap都需要我们手动设置Enable和Disable。
SimpleDemo_UsingState Demo
这个Demo和上一篇文章中,最初的方法一样,通过Gamepad.current来获取输入设备并且绑定事件等,这里就不在复述了。
随着Input System的更新,官方的Demo可能也会有所出入,文章用的版本是1.0.0 preview.4。
通过demo我们可以发现,.inputactions文件中的Action Maps即对应的是C#中的InputActionMap,Actions中的每项数据对应的即是InputAction。关于这一块的详解大家可以看https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Actions.html
其中:
1.每个Action都有started, performed, 和canceled 三个回调。
2.每个都有ActionMap都有actionTriggered的回调。
3.新的输入系统有个全局的InputSystem.onActionChange的回调。
4.你可以在需要的时候去查看Action的状态,例如在Update方法中使用InputAction.ReadValue<>()。
5.InputActionTrace可以用来纪录Action的改变。
每个Action的状态如下(可以通过 InputAction.phase 来获取):
阶段 | 含义 |
Disable | 被禁用,无法接收到输入 |
Waiting | 被启用,并且等待设备的输入 |
Started | 接收到设备的输入,并且形成交互 |
Performed | 交互完成 |
Canceled | 取消交互 |
其中started, performed, 和canceled三个阶段,会有回调,参数为InputAction.CallbackContext。我们可以从中读取一些有用的数据,例如InputAction.CallbackContext.ReadValue。
var action = new InputAction();
action.started += ctx => /* Action was started */;
action.performed += ctx => /* Action was performed */;
action.canceled += ctx => /* Action was canceled */;