InputSystem
1. 安装
2. 创建InputActions
在Project视图中Assets/Resource/Input下右键创建
这是一个空的InputActions
InputSystem相关介绍
层级关系:InputSystem=>InputActions=>ActionMaps=>Actions
简单来说我们可以将InputActions视为我们项目里其中一个控制器的输入操作管理集,而ActionMaps则为该控制器其中的一个输入映射集。而Actions则为ActionMaps里其中一个动作输入映射。
总的来说:一个InputActions可以包含多个ActionMaps,一个ActionMaps又能包含多个Actions
3. 配置ActionMaps
这里我需要2个数据,一是方向盘旋转的数据,二是脚踏板上的油门和刹车
先展示下完整配置
可以看出,我添加了一个叫XInput的动作映射集,然后在XInput下又创建了3个动作
接下来我们再分别看下每个动作的映射
首先,第一个我们创建方向盘旋转的动作映射Steeringwheel,当我们创建一个Action后,会发现右侧Action栏中有一些配置,如下图
其中常用的ActionType,各个参数说明如下:
- Button 默认设置,包括按钮或者按键触发的一次性动作(按下或抬起分别会触发一次)
- Value 提供一种连续状态变化事件,如果设置了多个输入,就会切换到最主要的一个。用它进行模拟控制,比如移动。
- Pass Through 和Value很相似,但它不会像Value一样(如果有多个输入时,不会只选择最主要的那个,而把其他的输入忽略)
很明显,方向盘是一种连续变化的值,因此我们尝试将ActionType设为Value,会发现其下多出一个ControlType选项,如下图
这里我们如何确定到底选择哪个类型的值呢?
可以使用InputSystem自带的一个分析工具InputDebugger
这里我们可以看到有一个XInput的控制器,这个就是我们的方向盘,双击打开查看详细信息
在这里我们可以看到方向盘的全部数据,接着我们尝试转动方向盘,同时观察数据变化,找到方向盘的数据项
最终发现方向盘的类型为LeftStick,即左摇杆,往左打死x轴值为 -1,往右打死为1,回正为0,值范围 -1 ~ 1,类型为StickControl,用同样的方法找出油门和刹车踏板的类型刹车:DisplayName为LeftTrigger,类型为Button,值范围 0 ~ 1
油门:DisplayName为RightTrigger,类型为Button,值范围 0 ~ 1
知道了这些就好办了,那么Steeringwheel的ControlType就是stick,仔细观察我们可以看到stick类型的数据,是有两个值的(x, y),因此这里选择Vector2也是可以的。
两个踏板虽然是ButtonControl类型,但其值的变化也是连续的,因此两个踏板我们将其ControlType设为Axis,表示一维轴浮点数
到这里我们创建好3个动作的映射
展开Actions发现其下还有Binding需要配置,这里我们需要配置Binding的Path参数,展开发现有很多选项
可以手动选择,手动选择可能会找不到需要的,也可以直接搜索,这里我们输入Left Stick直接搜索
由于我这款方向盘是支持DInput和XInput两种模式,而XInput又是微软提供的一套标准控制器API,微软的XBoxOne的手柄也是用的XInput,因此这里选择Left Stick [Xbox Controller]两个踏板同理
配置完后记得保存
然后在Project视图中选中InputActions文件,右侧Inspector勾选生成C#类,点击Apply应用,会生成一个InputActions.cs的脚本
这个脚本不需要修改,我们后面使用它就行
4. 编写处理函数
接下来,我们创建一个空对象,为其添加一个Player Input组件,并创建一个脚本Wheel Controller
观察PlayerInput组件的Behavior属性,有4个选项(具体区别自行查阅),我们选择Send Message
使用Send Message时,每次的触发会盗用一个对应的函数(就是在对应的Actions名前面加个On-)正如下图所示在我们PlayerInput组件当中我们将BehaviorType选择了Send Message后我们的输入参数将会通过Send Message方法发送到我们对应生成的函数中
比如Input Action 名为 Jump,那么对应的函数即为 OnJump
在Wheel Controller脚本中添加3个动作的处理函数
// 将上一步生成的InputActions脚本定义为成员变量,
// 并在OnEnable和OnDisable是启用和禁用对应的ActionMaps
private InputActions input;
private void Awake()
{
input = new InputActions();
}
private void OnEnable()
{
input.XInput.Enable();
}
private void OnDisable()
{
input.XInput.Disable();
}
void OnSteeringwheel(InputValue value)
{
moveVal = value.Get<Vector2>();
Debug.Log($"OnSteeringwheel: {moveVal}");
}
void OnBrake(InputValue value)
{
brakeVal = value.Get<float>();
Debug.Log($"OnBrake: {brakeVal}");
}
void OnAcceleration(InputValue value)
{
accelerationVal = value.Get<float>();
Debug.Log($"OnAcceleration: {accelerationVal}");
}
然后运行,观察控制台打印