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:输入动作设置
-
Action Type:动作类型
-
Value:值类型
主要用于状态连续更改的输入,例如鼠标的移动,手柄的遥感。如果有多个设备绑定这个 Action,只会发送其中一个设备(最受控制的)的输入
-
Button:按钮类型
用于每次按下时触发的 Action
-
Pass Through:直通类型
和 Value 一样,区别在于如果有多个设备绑定这个 Action,会发送所有设备的输入
-
-
Control Type:控制类型
在这里选择对应的类型,之后在选择对应设备按键相关属性时,会根据你选择内容的不同,筛选对应内容
这上面显示的内容就是各设备属性的返回值类型
当你选择他们后,非选择的类型将不会在之后的按键设置中出现
很多内容我们基本用不到,相当于是在这里筛选输入设备
名称 | 解释 | 名称 | 解释 |
---|---|---|---|
Any | 任何值 | Integer | 整数 |
Axis | 一维轴浮点数,例如:摇杆输入返回值 | Quaternion | 四元数 |
Bone | 骨骼 | Stick | 摇杆相关 |
Digital | 数字 | Touch | 触屏相关 |
Dpad | 4 向按钮,例如:摇杆上的 D-pad | Vector2 | 2 维向量 |
Eyes | VR 相关数值 | Vector3 | 3 维向量 |
(2)Interactions:相互作用设置
用于特殊输入,比如长按、多次点击等等,当满足条件时才会触发这个行为(设置长按时间、点击次数等等)
默认关联了以下 3 个输入事件,我们可以通过代码为事件添加监听逻辑:
- 开始:Started
- 触发:Performed
- 结束:Canceled
-
Hold:长按。
适用于需要输入设备保持一段时间的操作。
当按钮按下会触发 Started。
若在松开按钮前,按住时间大于等于 Hold Time 则会触发 Performed(时间一到就触发)
否则触发 Canceled。
- Press Point:在 Input System 中,每个按钮都有对应的浮点值,例如普通的按钮,将会在 0(未按下)和 1(按下)之间。因此我们可以利用这个值(Press Point)来进行区分,当大于等于这个值则认为按钮按下了。
-
Tap:单击
和 Hold 相反,需要在一段时间内按下松开来触发。
当按钮按下会触发 Started
若在 Max Tap Duriation 时间内(小于)松开按钮,触发 Performed
否则触发 Canceled。
-
SlowTap:长按并松开。
类似 Hold,但是它在按住时间大于等于 Max Tap Duriation 的时候,并不会立刻触发 Performed,而是会在松开的时候才触发 Performed
-
MultiTap:连击。
用作于多次点击,例如双击或者三连击。
- Tap Count:点击次数
- Max Tap Spacing:每次点击之间的间隔(默认值为 2 * Max Tap Duration)
- Max Tap Duration:每次点击的持续时间,即按下和松开按钮的这段时间。
当每次点击时间小于 Max Tap Duration,且点击间隔时间小于 Max Tap Spacing,点击 Tap Count 次,触发 Performed。
-
Press:按下
可以实现类似按钮的操作
-
Press Only:按下的时候触发 Started和 Performed。不触发 Canceled
-
Release Only:按下的时候触发 Started,松开的时候触发 Performed
-
Press And Release:按下的时候触发 Started和 Performed,松开的时候会再次触发 Started和 Performed。不触发 Canceled
-
(3)Processors:值处理加工设置
对得到的值进行处理加工
-
Clamp:将输入值钳制到 [min,max] 范围。
-
Invert:反转控件中的值(即,将值乘以 -1)。
-
Invert Vector 2:反转控件中的值(即,将值乘以 -1)。
如果 invertX 为真,则反转矢量的 x 轴
如果 invertY 为真,则反转矢量的 y 轴。
-
Invert Vector 3:反转控件中的值(即,将值乘以 -1)。
如果反转 x 为真,则反转矢量的 x 轴
如果反转 y 为真,则反转 y 轴
如果反转 z 为真,则反转 z 轴
-
Normalize:
如果最小值 >= 0,则将 [min,max] 范围内的输入值规格化为无符号规格化形式 [0,1]
如果最小值 < 0,则将输入值规格化为有符号规格化形式 [-1,1]。
-
Normalize Vector 2:将输入向量规格化为单位长度(1)。
-
Normalize Vector 3:将输入向量规格化为单位长度(1)
-
Scale:将所有输入值乘以系数。
-
Scale Vector 2:将所有输入值沿 x 轴乘以 x,沿 y 轴乘以 y。
-
Scale Vector 3:将所有输入值沿 x 轴乘以 x,沿 y 轴乘以 y,沿 z 轴乘以 z。
-
Axis Deadzone:axis 死区处理器缩放控件的值,使绝对值小于最小值的任何值为 0,绝对值大于最大值的任何值为 1 或 -1。
许多控件没有精确的静止点(也就是说,当控件位于中心时,它们并不总是精确报告 0)。在死区处理器上使用最小值可避免此类控件的无意输入。此外,当轴一直移动时,某些控件不一致地报告其最大值。在死区处理器上使用最大值可确保在这种情况下始终获得最大值。
-
Stick Deadzone:摇杆死区处理器缩放 Vector2 控件(如摇杆)的值,以便任何幅值小于最小值的输入向量都将得到(0,0),而任何幅值大于最大值的输入向量都将规格化为长度 1。
许多控件没有精确的静止点(也就是说,当控件位于中心时,它们并不总是精确地报告(0,0)。在死区处理器上使用最小值可避免此类控件的无意输入。此外,当轴一直移动时,某些控件不一致地报告其最大值。在死区处理器上使用最大值可确保在这种情况下始终获得最大值。
(二)点击加号
-
Add Binding
添加新的输入绑定(单按键输入)
-
Add Positive \\ Negative Binding
Or
Add 1D Axis Composite
添加 1D 轴组合(类似 Input 中的水平竖直热键,返回 -1 ~ 1 之间的一个值)
-
Add Up \\ Down \\ Left \\ Right Composite
Or
Add 2D Vector Composite
添加 2D 向量组合(类似将 Input 中的水平竖直热键组合在一起,得到的 Vector 中的 x,y 分别表示两个轴)
-
Add Up \\ Down \\ Left \\ Right \\ Forward \\ Backward Composite
添加 3D 向量组合
-
Add Button With One Modifier Composite
添加带有一个复合修改器的按钮(可以理解为双组合键, 比如 Ctrl + C、Ctrl + V)
-
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 <= 24‘d0; 38 else if (counter < 24‘d1000_0000) 39 counter <= counter + 1‘b1; 40 else 41 counter <= 24‘d0; 42 end 43 44 //通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态 45 always @(posedge sys_clk or negedge sys_rst_n) begin 46 if (!sys_rst_n) 47 led <= 4‘b0001; 48 else if(counter == 24‘d1000_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的主要内容,如果未能解决你的问题,请参考以下文章
2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1: 输入: n = 5 输出: 2 解释: 5 = 2 + 3,共有两组连续整数([5],[2,