Unity新输入方案InputSystem介绍-(一)

一、安装InputSystem
打开Package Manager,记得把高级选项中的"显示预览包"打勾。

选择InputSystem包,点击安装。

如果网络不好,或者想要参考官方例子,可以到Github下载项目。Assets文件夹下的文件是官方的测试例子,请根据你的学习需求进行删减。不想通过Package Manager安装InputSystem,也可以用Unity直接打开Github克隆下来的项目。

打开PlayerSettings,在Active Input Handling中启用InputSystem功能(两个选项任一个都行)。

这时候有可能提醒重启项目,按下Apply按钮即可。

到此,InputSystem安装完毕。

二、了解InputSystem新增编辑器要素
1.InputSystem设置
打开Project Settings,你会发现多了一个"Input System Package"选项卡。在这里,你可以新建一个设置资源,来重新设置InputSystem的更新模式、全局参数、支持设备等。

2.InputActionAsset
点击菜单栏Assets/Create/Input Actions,即可新建一个InputActionAsset文件。选择该文件,你会发现一个编辑按钮和一个生成C#类选项。

由于这个编辑器的介绍,会和下一篇一起讲,所以这里打开一下,就跳过

这里先说一点题外话,整个InputSystem中,文本反序列化功能十分强大,可以通过json字符串参数调用一些API,来实现复杂的输入功能。甚至你用文本编辑器打开InputActionAsset文件,也会发现是个json格式的文本文件。而且自动生成C#类这个功能,应该是官方考虑一些繁琐操作,特意做的代码生成器。

3.InputSystem分析工具
点击菜单栏Window/Analysis/Input Debugger,会出现下面这个别致的小东西

Devices:当前连接的输入设备;
Layouts:当前在InputSystem注册的Layout和Control;
Settings:InputSystem的设置;
Metrics:当前一些数据统计;
在这里可以方便查看InputSystem的各类信息和状态,比如我打开了一个手柄设备,可以说是所有信息一览无余。


三、InputSystem设备管理的大致一览
这里简单总结一下InputSystem的架构,一个输入设备抽象成Layout(布局),一个输入元件抽象成Control(控件)。一个设备像是拼积木玩具似的,一个Layout包含多个Control,然后注册到InputSystem中。
现在让我们回来看看,刚才略过的Input Debugger→Layouts:



代码访问设备也十分简单。一类输入设备,通常有两个静态属性,current(当前设备)和all(所有设备列表)。比如,打印手柄的右扳机的数值,可以这样写:
print(Gamepad.current.rightTrigger.ReadValue());
当然Input小老弟能做的事情,InputSystem也能做。比如鼠标刚按下左键,键盘刚刚弹起空格键,可以这么写:
print(Mouse.current.leftButton.wasPressedThisFrame);
print(Keyboard.current[Key.Space].wasReleasedThisFrame);
官方也给出了Input迁移到到InputSystem的文档,大致都是静态函数返回值,变成某一类设备的Control数值或是状态值,这样一个套路。为了把大量设备接口暴露出给开发者,官方不得不爆肝更新,但可惜正式版也各种跳票。

四、个人对InputSystem的展望
如果有能力研究源码的小伙伴,想了解一下各种设备如何接入InputSystem,可以看看InputSystem/Plugins这个文件夹。这个同时也是作为第三方设备接入InputSystem的第一手参考资料。而且目前看来,官方虚拟按键和虚拟摇杆已经在做了,想必开发移动端游戏会更加容易。

这里举几个令人兴奋的新用途(虽然大部分和XR相关):
绑定XR跟踪设备更加轻松灵活:

UGUI的Input会更加人性化:

输入参数变成,输入绑定或输入资源?:

更多官方插件和第三插件整合InputSystem...
下一篇,就是本系列的压轴,InputAction的编辑和使用。
