Unity通过两个独立的系统提供输入支持:
- 输入管理器InputManager是Unity核心平台的一部分,默认情况下就能使用。
- 输入系统InputSystem,必须使用PackageManager安装才能使用,是Unity新版的主推的输入系统,它需要.net4 运行时。
在 Unity 设计之初,并没有预见到现在如此丰富的平台和设备支持规模,所以一开始设计的输入系统 UnityEngine.Input 使用起来并不舒适,在多设备和多平台输入处理时显得力不从心且不够优雅,甚至连游戏中热插拔手柄这种操作都显得十分臃肿和复杂。Unity Tec 从 2016 年起开始逐步开发新一代输入系统 UnityEngine.InputSystem ,到今天(Unity 2019.3.0f6),已经迭代到了 1.0.0-preview.4 版本。官方表示大概在 Unity 2020 版本推出新输入系统的正式版,但是旧输入系统的下架时间并没有被明确。
新输入系统基于事件,输入设备和动作逻辑互相分离,通过配置映射来处理输入信息。具有易用,多设备多平台协调一致的特点。现在已经可以在 Package Manager 中安装使用了。
Unity的这两种输入系统是互斥的,要想更改只能重启。Unity的XR Interaction Toolkit也有最新版,新版的特点就是鼓励使用基于Action的输入,不鼓励直接访问设备的输入,这种理念与InputSystem是相似的。我认为InputManager和Devices-Based XR输入系统更具灵活性并且容易上手。
https://docs.unity3d.com/Packages/com.unity.inputsystem@1.4/manual/Migration.html
如何避免InputSystem频繁弹窗?
新版的输入系统InputSystem需要通过PackageManager安装,只有在安装了InputSystem的情况下才会弹窗,要想避免弹窗,直接在Pacakge/manifest里面把InputSystem删掉即可。
如何切换到InputSystem?
- 打开PacakgeManager添加InputSystem包,一旦导入这个包,之后每次打开Unity如果没有启用新输入系统都会提示是否启用新的输入系统。
- 在PlayerSettings里面设置输入为新的InputSystem
- 把各个场景中的EventySystem按照提示启用新输入系统的MonoBehavior。
- 对于类似InGameDebugConsole等一些库,需要手动添加引用,解决编译报错。
输入涉及到的API
-
Input的静态方法系列
-
移动设备使用Input.touches
foreach(Touch touch in Input.touches) { if (touch.phase == TouchPhase.Began) { // 从当前触摸坐标构造一条射线 Ray ray = Camera.main.ScreenPointToRay(touch.position); if (Physics.Raycast(ray)) { // 如果命中,则创建一个粒子 Instantiate(particle, transform.position, transform.rotation); } } }
-
VR、XR的InputDevices系列