2022-09-09 Unity InputSystem3——InputAction

Posted 蔗理苦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)Action:输入动作设置

  1. Action Type:动作类型

    • Value:值类型

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

    • Button:按钮类型

      用于每次按下时触发的 Action

    • Pass Through:直通类型

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

  2. Control Type:控制类型

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

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

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

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

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

(2)Interactions:相互作用设置

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

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

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

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

    当按钮按下会触发 Started。

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

    否则触发 Canceled。

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

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

    当按钮按下会触发 Started

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

    否则触发 Canceled。

  3. SlowTap:长按并松开。

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

  4. MultiTap:连击。

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

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

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

  5. Press:按下

    可以实现类似按钮的操作

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

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

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

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

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

  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)。在死区处理器上使用最小值可避免此类控件的无意输入。此外,当轴一直移动时,某些控件不一致地报告其最大值。在死区处理器上使用最大值可确保在这种情况下始终获得最大值。

(二)点击加号

  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:从哪个控件接受输入

  • 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("组合键触发"); ;

FPGA基础入门程序代码

 1 module flow_led(
 2     input               sys_clk  ,  //系统时钟,外部时钟50M
 3     input               sys_rst_n,  //系统复位,低电平有效
 4      
 5     output  reg  [3:0]  led         //4个LED灯
 6     );
 7 
 8 //reg define
 9 reg [23:0] counter;
10 /*点灯如何实现?首先定义led4位寄存器,对应四个接口。灯接法共地,输出高电平(1)点亮一个灯。
11    如何循环点亮灯?led <= 4‘b0001;即        led[0]=1
12                                         led[1]=0
13                                         led[2]=0
14                                         led[3]=0
15     
16     执行一次{led[2:0],led[3]}取高位与低位拼接,得led<=4‘b0010
17     
18     延时如何实现?首先理解在FPGA的always块是并行执行,但是在always中是顺序执行,即counter == 24‘d1000_0000时(24位十进制数)
19      counter <= 24‘d0;
20      
21      led[3:0] <= {led[2:0],led[3]};
22     
23 
24     */
25 //*****************************************************
26 //**                    main code
27 //***************************************************** 
28                                                                                                                                                                                                                          
29 //计数器对系统时钟计数,计时0.2秒
30 /*
31     t=1/f=1/50,000,000
32     0.2s=t*10000,0000
33 
34     */
35 always @(posedge sys_clk or negedge sys_rst_n) begin
36     if (!sys_rst_n)
37         counter <= 24d0;
38     else if (counter < 24d1000_0000)
39         counter <= counter + 1b1;
40     else
41         counter <= 24d0;
42 end
43 
44 //通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
45 always @(posedge sys_clk or negedge sys_rst_n) begin
46     if (!sys_rst_n)
47         led <= 4b0001;
48     else if(counter == 24d1000_0000) 
49         led[3:0] <= {led[2:0],led[3]};
50     else
51         led <= led;
52 end
53 
54 endmodule 

以上是关于2022-09-09 Unity InputSystem3——InputAction的主要内容,如果未能解决你的问题,请参考以下文章

FPGA基础入门程序代码

Modelsim与Quartus联合调用

FPGA实验流水灯实验

同步FIFO与异步FIFO的Verilog实现

2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1: 输入: n = 5 输出: 2 解释: 5 = 2 + 3,共有两组连续整数([5],[2,

unity怎么保存 unity保存的教程