前言
上一篇文章,我们介绍了如何使用新版本的InputSystem,我们知道了InputActionsAsset给我们提供了更多的灵活性,扩展性和复用性。那么这篇文章我们就来介绍一下如何创建自定义InputActionAsset
创建InputActionAssets
Input Action Asset 是包含Input Actions及其关联的Bindings和Control Schemes 的资源。这些资源文件扩展名是.inputactions,并以纯 JSON 格式存储。
创建InputActionAssets:在“Projects”窗口中单击鼠标右键,或从 Unity 的主菜单转到“Assets”>“Create”>“Input Action” 。
编辑InputAssets
在Project面板,双击.inputactions资源,或在Inspector面本中选择“Edit Asset”按钮。就可以打开InputAction编辑器窗口,
如下所示:
InputAction编辑器窗口分为三个窗格:
1.左窗格列出了资产中的动作图。每个 Action Map 都是您可以批量启用或禁用的 Action 的集合。
2.中间的窗格包含当前选中的 Action Map 中的 Action,以及与每个 Action 关联的绑定。
3.右窗格包含当前选定的操作或绑定的属性。
编辑ActionMaps
在ActionMaps面板可以添加删除指定的ActionMaps,一个Map就是一个动作组,比如:Player操作的都放到Player的Map下,UI操作的都放到UI的Map下。
编辑动作
在Actions面板可以增加和删除指定的Action了。
一个Action可以添加多个动作绑定,比如跳跃可以是A键和B键等等。
Add Binding:添加普通按键绑定
Add Positive、Negative Binding:添加正负值的1维复合绑定
Add Up、Down、Left、Right Composite:添加上下左右的2维复合绑定
Add Up、Down、Left、Right、Forward、Backward Composite:添加上下左右前后的3维复合绑定
Add Binding With One Modifiler:添加一个组合按键的绑定,如Shift+A
Add Binding With Two Modifiler:添加两个组合按键的绑定,如Shit+Ctrl+A
Add Interger Fallback Composite:整形的回退组合
Add Quaternion Fallback Composite:四元数的回退组合
Add Vector3 Fallback Composite:向量的回退组合
Add 1D Axis Composite:添加一维的轴复合动作绑定
Add 2D Vector Composite:添加2维的向量复合动作绑定
Add Pointer Input Composite:添加指针类型复合动作绑定
如果选中一个动作,我们就可以在右侧窗格中编辑它的属性了,如下图所示:
编辑绑定Binding
如果选择绑定,则可以在窗口的右侧窗格中编辑其属性:
1.绑定控制器
任何绑定最重要的属性是它绑定到的控制路径。要编辑它,请打开路径下拉列表。这将显示一个控件选择器窗口。
在控件选择器窗口中,我们可以浏览InputSystem识别的输入设备(如VR设备,PS设备等)和控件树(手柄的按键等),并绑定到这些控件。
绑定有三种方法:
1).浏览查找绑定
设备和控制树按从通用到特定的层次结构进行组织。例如,游戏手柄控制路径/buttonSouth与任何游戏手柄上的下方操作按钮相匹配。或者,如果您导航到Gamepad > More Specific Gamepads并选择PS4 Controller,然后选择 Control path /buttonSouth,这只会匹配 PlayStation 游戏手柄上的“Cross”按钮,而不匹配任何其他游戏手柄。
2).监听按键绑定
与其浏览树来查找所需的控件,不如让输入系统侦听输入更容易。为此,请选择“Listen”按钮。起初,控件列表是空的。一旦您开始在要绑定到的设备上按下按钮或启动控件,控件选择器窗口就会开始列出与您按下的控件匹配的所有绑定。选择这些绑定中的任何一个以查看它们。
3).手动编辑绑定
最后,您可以选择手动编辑绑定路径,而不是使用控件选择器。为此,请选择“控制路径”弹出窗口旁边的T按钮。这会将弹出窗口更改为文本字段,您可以在其中输入任何绑定字符串。这还允许您在绑定中使用通配符 ( )。例如,您可以使用绑定路径,例如/touch/press绑定到触摸屏上按下的任何手指,而不是手动绑定到/touch0/press,/touch1/press等等。
编辑复合绑定
要创建复合绑定,请在 Input Action Asset 编辑器窗口中,选择要将其添加到的 Action 上的添加 (+) 图标,然后从弹出菜单中选择一个 Composite Binding 类型。
Composite Bindings是由多个部分组成的Bindings,它们共同组成一个Control。例如,2D Vector Composite使用四个按钮(左、右、上、下)来模拟 2D 摇杆输入。
Composite 本身没有 Binding 路径属性,但它的各个子部分有,我们可以像编辑任何其他 Binding 一样编辑这些子部分。一旦绑定了 Composite 的所有子部分,Composite 就可以协同工作,就像将单个控件绑定到 Action 一样。
注意:
(+)号菜单中显示的复合集是根据 操作的值类型 进行过滤的。这意味着,例如,如果将 Action 设置为类型“Button”,则只会float显示能够返回类型值的 Composites。
要追溯更改组合的类型,请选择组合,然后从“属性”窗格的“组合类型”下拉列表中选择新类型。
要更改分配给特定绑定的复合部分,请使用绑定属性中的复合部分下拉列表。
可以将多个绑定分配给同一部分。您还可以复制单个部件绑定:右键单击绑定,然后选择复制为合成创建新的部件绑定。例如,这可用于为“WASD”样式控件和箭头键创建单个复合。
绑定类型
1.一维轴
由两个按钮组成的复合材料:一个将 1D 轴拉向负方向,另一个将其拉向正方向。
2.二维矢量
代表 4 向按钮设置的 Composite,例如游戏手柄上的 D-pad。每个按钮代表一个主要方向。
此 Composite 最适用于表示上下左右控件,例如 WASD 键盘输入。
3.3D矢量
一个 Composite,表示一个 6 向按钮,其中两个组合分别控制 3D 矢量的一个轴。
4.一个修改键
一个 Composite,它要求用户按住“修改器”按钮以及另一个控件,从中确定 Binding 的实际值。例如,这可用于诸如“SHIFT+1”之类的绑定。
5.两个修改键
一个 Composite,它要求用户按住两个“修改器”按钮以及另一个控件,从中确定 Binding 的实际值。例如,这可以用于诸如“SHIFT+CTRL+1”之类的绑定。
6.自定义复合类型
我们可以定义新的复合类型,并使用 API 注册它们。Unity 将这些视为预定义类型,输入系统在内部以相同的方式定义和注册这些类型。
要定义一种新的 Composite 类型,创建一个继承InputBindingComposite类,并实现接口即可。
Interactions交互设置
Interactions交互代表特定的输入模式。例如,长按,轻击,双击等操作。
交互有一组不同的阶段,它可以响应接收到的输入而经历。
阶段 | 描述 |
---|---|
Waiting | 交互正在等待输入 |
Started | 交互已经开始(也就是说,它收到了一些预期的输入),但还没有完成。 |
Performed | 交互完成。 |
Canceled | 交互被中断并中止。例如,用户按下然后松开一个按钮保持互动去完成。 |
并非每个交互都会触发每个阶段,特定交互触发阶段的模式取决于交互类型。
多个交互
如果单个绑定或操作上存在多个交互,则输入系统会按照交互在绑定上出现的顺序检查交互。
交互类型
1.默认交互
输入系统包附带了一组您可以使用的基本交互。如果 Action 没有设置 Interactions,系统将使用其默认的 Interaction。
2.Press交互
您可以使用 PressInteraction来明确强制执行类似按钮的交互。使用该behavior参数来选择交互是否应在按下、释放或同时触发按钮时触发。
3.Hold交互
要求用户在输入系统触发操作之前HoldInteraction按住控件几秒钟。
4.Tap交互
TapInteraction要求用户在几秒钟内按下并释放一个 Controlduration以触发 Action。
5.SlowTap交互
SlowTapInteraction要求用户按住控件至少几duration秒钟,然后松开,以触发操作。
6.多次点击
要求用户在几秒钟MultiTapInteraction内按下并释放一个控件,点击之间的时间不超过几秒钟,以便触发交互。您可以使用它来检测双击或多次单击手势。
7.自定义交互
我们可以编写自定义交互以在项目中使用。添加一个实现IInputInteraction接口的类即可。
Processor处理器
Input Processor接受一个值并为其返回处理后的结果。接收值和结果值必须是同一类型。
处理器类型
Clamp:将输入值限制在 [ min… max] 范围内。
Invert:反转控件中的值(即,将值乘以 -1)。
InvertVector2:反转控件中的值(即,将值乘以 -1)。如果为真,则反转向量的 x 轴,如果为真invertX,则反转 y 轴
InvertVector3:反转控件中的值(即,将值乘以 -1)。如果为真,则反转向量的 x 轴invertX,如果为真,则反转 y 轴invertY,如果为真,则反转 z 轴invertZ。
Normalize:min将 [ … ]范围内的输入值规范化max为无符号规范化形式 [0…1](如果min>=)zero,并规范化为有符号规范化形式 [-1…1](如果min< zero)。
NormalizeVector2:将输入向量标准化为单位长度 (1)。这与调用相同Vector2.normalized。
NormalizeVector3:将输入向量标准化为单位长度 (1)。这与调用相同Vector3.normalized。
Scale:将所有输入值乘以factor。
ScaleVector2:将所有输入值x沿 X 轴和y沿 Y 轴乘以。
ScaleVector3:将所有输入值沿xX 轴、y沿 Y 轴和z沿 Z 轴乘以。
AxisDeadZone:缩放控件的值,以使绝对值小于min的任何值都是 0,而绝对值大于max的任何值都是 1 或 -1。
StickDeadzone:缩放 Vector2 控件(例如棒)的值,以便幅度小于min的任何输入向量结果为 (0,0),幅度大于max的任何输入向量max都归一化为长度 1。
自定义Processor
我们还可以编写自定义处理器以在项目中使用。添加派生自 的类InputProcessor,并实现该Process方法: