• 2022-09-09 Unity InputSystem3——InputAction



    ​ 顾名思义,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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    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
    
            // 持续时间
            print(context.duration);
    
            // 开始时间
            print(context.startTime);
        };
    
        // 结束操作
        move.canceled += (context) => { print("结束事件调用"); };
    
        btnOne.performed += (context) => { print("组合键触发"); };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
  • 相关阅读:
    详细解读Latent Diffusion Models:原理和代码
    java学习第三周总结。。。
    WebRtc系列
    Unity中Shader的矩阵加减法
    杰理之下载目录 INI 配置文件生成【篇】
    数据库配置口令复杂度策略和口令有效期策略
    零基础入门JavaWeb——JS的事件驱动
    Springboot错误ASM ClassReader failed
    uniapp的两个跳转方式
    计算机毕业设计Java红色景点自驾游网站管理系统(源码+系统+mysql数据库+lw文档)
  • 原文地址:https://blog.csdn.net/zheliku/article/details/126775305