InputSystem

1. 安装

unity 安卓游戏修改_搜索


unity 安卓游戏修改_unity 安卓游戏修改_02


unity 安卓游戏修改_unity 安卓游戏修改_03

2. 创建InputActions

在Project视图中Assets/Resource/Input下右键创建

unity 安卓游戏修改_游戏引擎_04


这是一个空的InputActions

unity 安卓游戏修改_游戏引擎_05


unity 安卓游戏修改_游戏引擎_06

InputSystem相关介绍

层级关系:InputSystem=>InputActions=>ActionMaps=>Actions

简单来说我们可以将InputActions视为我们项目里其中一个控制器的输入操作管理集,而ActionMaps则为该控制器其中的一个输入映射集。而Actions则为ActionMaps里其中一个动作输入映射。
总的来说:一个InputActions可以包含多个ActionMaps,一个ActionMaps又能包含多个Actions

3. 配置ActionMaps

这里我需要2个数据,一是方向盘旋转的数据,二是脚踏板上的油门和刹车

先展示下完整配置

unity 安卓游戏修改_unity_07


可以看出,我添加了一个叫XInput的动作映射集,然后在XInput下又创建了3个动作

接下来我们再分别看下每个动作的映射

首先,第一个我们创建方向盘旋转的动作映射Steeringwheel,当我们创建一个Action后,会发现右侧Action栏中有一些配置,如下图

unity 安卓游戏修改_unity_08


其中常用的ActionType,各个参数说明如下:

  1. Button 默认设置,包括按钮或者按键触发的一次性动作(按下或抬起分别会触发一次)
  2. Value 提供一种连续状态变化事件,如果设置了多个输入,就会切换到最主要的一个。用它进行模拟控制,比如移动。
  3. Pass Through 和Value很相似,但它不会像Value一样(如果有多个输入时,不会只选择最主要的那个,而把其他的输入忽略)

很明显,方向盘是一种连续变化的值,因此我们尝试将ActionType设为Value,会发现其下多出一个ControlType选项,如下图

unity 安卓游戏修改_unity_09


这里我们如何确定到底选择哪个类型的值呢?

可以使用InputSystem自带的一个分析工具InputDebugger

unity 安卓游戏修改_搜索_10


unity 安卓游戏修改_unity_11


这里我们可以看到有一个XInput的控制器,这个就是我们的方向盘,双击打开查看详细信息

unity 安卓游戏修改_unity 安卓游戏修改_12


在这里我们可以看到方向盘的全部数据,接着我们尝试转动方向盘,同时观察数据变化,找到方向盘的数据项

unity 安卓游戏修改_unity 安卓游戏修改_13


最终发现方向盘的类型为LeftStick,即左摇杆,往左打死x轴值为 -1,往右打死为1,回正为0,值范围 -1 ~ 1,类型为StickControl,用同样的方法找出油门和刹车踏板的类型刹车:DisplayName为LeftTrigger,类型为Button,值范围 0 ~ 1

unity 安卓游戏修改_数据_14


油门:DisplayName为RightTrigger,类型为Button,值范围 0 ~ 1

unity 安卓游戏修改_unity_15

知道了这些就好办了,那么Steeringwheel的ControlType就是stick,仔细观察我们可以看到stick类型的数据,是有两个值的(x, y),因此这里选择Vector2也是可以的。
两个踏板虽然是ButtonControl类型,但其值的变化也是连续的,因此两个踏板我们将其ControlType设为Axis,表示一维轴浮点数

到这里我们创建好3个动作的映射

unity 安卓游戏修改_搜索_16


展开Actions发现其下还有Binding需要配置,这里我们需要配置Binding的Path参数,展开发现有很多选项

unity 安卓游戏修改_数据_17


可以手动选择,手动选择可能会找不到需要的,也可以直接搜索,这里我们输入Left Stick直接搜索

unity 安卓游戏修改_游戏引擎_18


由于我这款方向盘是支持DInput和XInput两种模式,而XInput又是微软提供的一套标准控制器API,微软的XBoxOne的手柄也是用的XInput,因此这里选择Left Stick [Xbox Controller]两个踏板同理

unity 安卓游戏修改_数据_19


配置完后记得保存

unity 安卓游戏修改_unity 安卓游戏修改_20


然后在Project视图中选中InputActions文件,右侧Inspector勾选生成C#类,点击Apply应用,会生成一个InputActions.cs的脚本

unity 安卓游戏修改_unity 安卓游戏修改_21


unity 安卓游戏修改_unity_22


这个脚本不需要修改,我们后面使用它就行

4. 编写处理函数

接下来,我们创建一个空对象,为其添加一个Player Input组件,并创建一个脚本Wheel Controller

unity 安卓游戏修改_unity_23


观察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}");
    }

然后运行,观察控制台打印

unity 安卓游戏修改_unity 安卓游戏修改_24