zl程序教程

您现在的位置是:首页 >  Javascript

当前栏目

2022-09-09 Unity InputSystem3——InputAction

2023-04-18 16:45:55 时间


​ 顾名思义,InputAction 是 InputSystem 帮助我们封装的输入动作类
​ 它的主要作用,是不需要我们通过写代码的形式来处理输入,而是直接在 Inspector 窗口编辑想要处理的输入类型
​ 当输入触发时,我们只需要把精力花在输入触发后的逻辑处理上

​ 我们在想要用于处理输入动作的类中,申明对应的 InputAction 类型的成员变量(注意:需要引用命名空间 UnityEngine.InputSystem

一、InputAction 参数

​ 编写脚本挂载到物体上

public class Lesson7 : MonoBehaviour
{
    [Header("Binding")]         public InputAction move;
    [Header("1D Axis")]         public InputAction axis;
    [Header("2D Vector")]       public InputAction vector2D;
    [Header("3D Vector")]       public InputAction vector3D;
    [Header("Button With One")] public InputAction btnOne;
}
image-20220828192642213

(一)点击齿轮

image-20220828192940774

(1)Action:输入动作设置

  1. Action Type:动作类型

    • Value:值类型

      主要用于状态连续更改的输入,例如鼠标的移动,手柄的遥感。如果有多个设备绑定这个 Action,只会发送其中一个设备(最受控制的)的输入

    • Button:按钮类型

      用于每次按下时触发的 Action

    • Pass Through:直通类型

      和 Value 一样,区别在于如果有多个设备绑定这个 Action,会发送所有设备的输入

  2. Control Type:控制类型

    image-20220828193743637

    在这里选择对应的类型,之后在选择对应设备按键相关属性时,会根据你选择内容的不同,筛选对应内容

    这上面显示的内容就是各设备属性的返回值类型

    当你选择他们后,非选择的类型将不会在之后的按键设置中出现

    很多内容我们基本用不到,相当于是在这里筛选输入设备

名称解释名称解释
Any任何值Integer整数
Axis一维轴浮点数,例如:摇杆输入返回值Quaternion四元数
Bone骨骼Stick摇杆相关
Digital数字Touch触屏相关
Dpad4 向按钮,例如:摇杆上的 D-padVector22 维向量
EyesVR 相关数值Vector33 维向量

(2)Interactions:相互作用设置

​ 用于特殊输入,比如长按、多次点击等等,当满足条件时才会触发这个行为(设置长按时间、点击次数等等)

image-20220828194354418

​ 默认关联了以下 3 个输入事件,我们可以通过代码为事件添加监听逻辑:

  • 开始:Started
  • 触发:Performed
  • 结束:Canceled
  1. Hold:长按。

    image-20220828194514014

    适用于需要输入设备保持一段时间的操作。

    当按钮按下会触发 Started。

    若在松开按钮前,按住时间大于等于 Hold Time 则会触发 Performed(时间一到就触发)

    否则触发 Canceled。

    • Press Point:在 Input System 中,每个按钮都有对应的浮点值,例如普通的按钮,将会在 0(未按下)和 1(按下)之间。因此我们可以利用这个值(Press Point)来进行区分,当大于等于这个值则认为按钮按下了。
  2. Tap:单击

    image-20220828194856786

    和 Hold 相反,需要在一段时间内按下松开来触发。

    当按钮按下会触发 Started

    若在 Max Tap Duriation 时间内(小于)松开按钮,触发 Performed

    否则触发 Canceled。

  3. SlowTap:长按并松开。

    image-20220828194951369

    类似 Hold,但是它在按住时间大于等于 Max Tap Duriation 的时候,并不会立刻触发 Performed,而是会在松开的时候才触发 Performed

  4. MultiTap:连击。

    image-20220828195202212

    用作于多次点击,例如双击或者三连击。

    • Tap Count:点击次数
    • Max Tap Spacing:每次点击之间的间隔(默认值为 2 * Max Tap Duration)
    • Max Tap Duration:每次点击的持续时间,即按下和松开按钮的这段时间。

    当每次点击时间小于 Max Tap Duration,且点击间隔时间小于 Max Tap Spacing,点击 Tap Count 次,触发 Performed。

  5. Press:按下

    image-20220828195557179

    可以实现类似按钮的操作

    • Press Only:按下的时候触发 Started和 Performed。不触发 Canceled

    • Release Only:按下的时候触发 Started,松开的时候触发 Performed

    • Press And Release:按下的时候触发 Started和 Performed,松开的时候会再次触发 Started和 Performed。不触发 Canceled

(3)Processors:值处理加工设置

​ 对得到的值进行处理加工

image-20220828195825630
  1. Clamp:将输入值钳制到 [min,max] 范围。

  2. Invert:反转控件中的值(即,将值乘以 -1)。

  3. Invert Vector 2:反转控件中的值(即,将值乘以 -1)。

    如果 invertX 为真,则反转矢量的 x 轴

    如果 invertY 为真,则反转矢量的 y 轴。

  4. Invert Vector 3:反转控件中的值(即,将值乘以 -1)。

    如果反转 x 为真,则反转矢量的 x 轴

    如果反转 y 为真,则反转 y 轴

    如果反转 z 为真,则反转 z 轴

  5. Normalize:

    如果最小值 >= 0,则将 [min,max] 范围内的输入值规格化为无符号规格化形式 [0,1]

    如果最小值 < 0,则将输入值规格化为有符号规格化形式 [-1,1]。

  6. Normalize Vector 2:将输入向量规格化为单位长度(1)。

  7. Normalize Vector 3:将输入向量规格化为单位长度(1)

  8. Scale:将所有输入值乘以系数。

  9. Scale Vector 2:将所有输入值沿 x 轴乘以 x,沿 y 轴乘以 y。

  10. Scale Vector 3:将所有输入值沿 x 轴乘以 x,沿 y 轴乘以 y,沿 z 轴乘以 z。

  11. Axis Deadzone:axis 死区处理器缩放控件的值,使绝对值小于最小值的任何值为 0,绝对值大于最大值的任何值为 1 或 -1。

    许多控件没有精确的静止点(也就是说,当控件位于中心时,它们并不总是精确报告 0)。在死区处理器上使用最小值可避免此类控件的无意输入。此外,当轴一直移动时,某些控件不一致地报告其最大值。在死区处理器上使用最大值可确保在这种情况下始终获得最大值。

  12. Stick Deadzone:摇杆死区处理器缩放 Vector2 控件(如摇杆)的值,以便任何幅值小于最小值的输入向量都将得到(0,0),而任何幅值大于最大值的输入向量都将规格化为长度 1。

    许多控件没有精确的静止点(也就是说,当控件位于中心时,它们并不总是精确地报告(0,0)。在死区处理器上使用最小值可避免此类控件的无意输入。此外,当轴一直移动时,某些控件不一致地报告其最大值。在死区处理器上使用最大值可确保在这种情况下始终获得最大值。

(二)点击加号

image-20220828201212321
  1. Add Binding

    添加新的输入绑定(单按键输入)

  2. Add Positive Negative Binding

    Or

    Add 1D Axis Composite

    添加 1D 轴组合(类似 Input 中的水平竖直热键,返回 -1 ~ 1 之间的一个值)

  3. Add Up Down Left Right Composite

    Or

    Add 2D Vector Composite

    添加 2D 向量组合(类似将 Input 中的水平竖直热键组合在一起,得到的 Vector 中的 x,y 分别表示两个轴)

  4. Add Up Down Left Right Forward Backward Composite

    添加 3D 向量组合

  5. Add Button With One Modifier Composite

    添加带有一个复合修改器的按钮(可以理解为双组合键, 比如 Ctrl + C、Ctrl + V)

  6. Add Button With Two Modifier Composite

    添加带有两个复合修改器的按钮(可以理解为三组合键,比如 Ctrl+ K + U)

​ 创建绑定后,可以添加对应需要绑定的输入设备

​ Path:从哪个控件接受输入

image-20220828201640743

  • Usages:常用用法
  • GamePad:游戏手柄
  • Joystick:操纵杆
  • Keyboard:键盘
  • Mouse:鼠标
  • Pen:笔
  • Pointer:指针
  • Sensor:传感器
  • TouchScreen:触屏
  • Tracked Device:履带装置
  • XR Controller:XR 控制器
  • XR HMD:XR 头戴显示器
  • Other:其它

二、使用 InputAction

[Header("Binding")]         public InputAction move;
[Header("1D Axis")]         public InputAction axis;
[Header("2D Vector")]       public InputAction vector2D;
[Header("3D Vector")]       public InputAction vector3D;
[Header("Button With One")] public InputAction btnOne;


// Start is called before the first frame update
void Start() {
    // 1.启用输入检测
    move.Enable();

    // 2.操作监听相关

    // 开始操作
    move.started += TestFun;

    // 真正触发
    move.performed += context => {
        print("触发事件调用");
        // 3.关键参数 CallbackContext

        // 当前状态
        // 没有启用 Disabled
        // 等待 Waiting
        // 开始 Started
        // 触发 Performed
        // 结束 Canceled

        // context.phase
        print(context.phase);

        // 动作行为信息 
        print(context.action.name);

        // 控件(设备)信息
        print(context.control.name);

        // 获取值
        //context.ReadValue<float>

        // 持续时间
        print(context.duration);

        // 开始时间
        print(context.startTime);
    };

    // 结束操作
    move.canceled += (context) => { print("结束事件调用"); };

    btnOne.performed += (context) => { print("组合键触发"); };
}