用人话讲!虚幻引擎 UE5 增强输入系统
注意:以下内容均基于个人理解,可能出现,误导,片面,错误等信息。请谨慎观看。
为什么要使用 增强输入系统 ?
从 UE5.1版本起 UE默认的输入都改成了 Enhanced Input (增强输入系统)
那么为什么要这样呢?简单举个栗子
比如我们的游戏角色 包含移动射击以及使用载具的功能
默认状态下 :
WSAD移动 左键射击
使用载具状态下 :
WASD移动 左键鸣笛
不难发现 其中两种操作中 只有 左键 的操作是不相同的
如果我们按照面向对象的角度来思考
可以将 WASD移动 的操作提出 在两种状态下共用
而 左键 则分别对应两种不同的状态进行定制
这样既方便维护也减少了BUG的产生。
至此我们就获得了 增强输入系统第一个新概念 输入映射向下文(Input Mapping Contexts)
输入映射向下文(Input Mapping Contexts)
输入映射向下文 简单粗俗来讲 ,就是上述的两种不同状态
并且你可以为一个状态指定多个! 输入映射上下文
那么就可以将上述的 状态操作 变成三个输入映射上下文!
输入映射向下文 | 对应操作 |
---|---|
输入映射向下文1 | WASD移动 |
输入映射向下文2 | 左键鸣笛 |
输入映射向下文3 | 左键射击 |
这样一来 :
载具状态下 : 我们可以为输入系统指定输入上下文为 输入映射向下文1 和 输入映射向下文2
默认状态下 : 我们可以为输入系统指定输入上下文为 输入映射向下文1 和 输入映射向下文3
这样就方便的实现了上述的情景
增强输入系统详解
概念组成
增强输入系统主要有四个概念: 除了上述的 输入映射向下文(Input Mapping Contexts) 还有
输入动作(Input Actions): 指具体动作内容 例如上文具体的 ‘移动’ ‘开枪’ ‘鸣笛’ 即具体的一个事件\行为。
修饰器(Modifiers):简单来讲就是原本输入的值进行修正,比如判断死区 ,根据FOV放大缩小输入值,取相反值等。
触发器(Triggers): 就是指在什么条件下才能触发或者如何触发 比如 长按,单击,按下,松开。
有点懵也很正常,下面我们分别讲讲这四个概念。
1. 输入映射向下文(Input Mapping Contexts)
如上文所述 主要针对不同状态 映射一套操作,来应对不同的情景 。
我们可以在里面对 输入动作(Input Actions) 映射不同的按键映射(具体的按下哪个键之类),
这是虚幻引擎模板中的输入映射向下文,其中 IA_Jump 、IA_Move 等 均为 输入动作(Input Actions)
并且为 输入动作(Input Actions) 指定了多个按键映射
即 空格 、手柄按下 、触摸1 均可触发 IA_Jump 这一输入动作
其中我们还可以对不同按键单独设置 触发器 和 修饰器 。(下文细嗦)
2. 输入动作(Input Actions)
输入动作 指的是具体的一个行为或者动作 ,并且可以使用 触发器 和 修饰器 进行精确描述,例如长按奔跑,单击下蹲等。
其实做主要的是需要指定对应动作 返回的值类型 即 图中 值类型。
栗如 开门 只有 开和不开两种 即 数字(布尔型)
栗如 移动 是一个轴值输入 即 Axis1D (浮点型)
- 消耗输入: 当消耗输入为真时 高优先级的输入将覆盖低优先级的操作
例如将上文中 左键开枪 和 左键鸣笛 的 同时添加到输入系统中
如果消耗输入为 False 那么 按下左键将 同时执行 开枪和鸣笛两个动作
即 输入没有被上层输入上下文消耗 传递到了下一层输入上下文中。
如果消耗输入为 True 那么按下左键将只执行 鸣笛 和 开枪 中 上下文优先级高的一个
即 输入在上层输入上下文中消耗掉了 - 暂停时触发 : 当游戏暂停时 是否有效
3.修饰器(Modifiers)
修饰器就是对原始输入的处理。主要包含以下
- 到世界空间 : 将一个 2D 的输入转换为 3D 的输入 例如将手柄的 XY轴输入映射为 XYZ输入 其中X为0。 作用和 拌合输入轴值 类似
- 否定 : 很容易理解 - 将输入的值取反 例 :原始输入 1 那么 经过修饰变为 -1 。可以单独指定对 XYZ哪一个轴取反
- 响应曲线 - 指数 :主要用于手柄或者其他线性输入,将输入响应对应为曲线 可以分别映射XYZ三轴的曲线
- 响应曲线 - 用户定义 : 同上 只不过用自定义曲线代替了指数曲线 可以分别映射XYZ三轴的曲线
- 平滑 : 对每一帧进行平滑处理 , 基本没用过 感受不到什么差距 (不清楚具体用途)
- 拌合输入轴值 : 将一个轴的输入对应到其他轴 ,例如将手柄 X轴输入 映射到Y轴 其实应该翻译成 交换输入轴值
- 按差量时间缩放 :将输入的值 乘以每帧的时间间隔,常用的修饰 ,可以实现在不同帧率情况下使得输入值总大小不变。
- 标量 :将原本0~1的轴值 映射到 任意大小 可以分别为XYZ轴设置不同的标量
- 盲区 :即死区,一般用于手柄等线性输入,即摇杆或者扳机键按到或者推倒什么区间响应 。
- 视野缩放 :即根据FOV(视场)的值 调整输入的值大小 可以具体对应调整比例
关于 拌合输入轴值 可以参阅 我的另一篇文章
注意 修饰器可以同时应用多个 并且会 从上到下依次调用
修饰顺序不同导致产生不同的输入结果
4. 触发器(Triggers)
触发器即为什么操作触发对应行为 主要包含以下
- 下移 : 即按下 按下后将持续触发 —— 对于线性按键可以指定阈值(按下多少大距离触发)
- 已按下 : 同上! 不过 按下后只触发一次
- 已松开 : 松开按键时 触发一次
- 弦操作 : 当另一个 输入动作 触发时 才能 通过按键触发当前动作(持续触发) —— 例如 移动 的时候才能 奔跑
- 点按 : 必须在指定时间内松开按键才会 触发一次 —— 可以设置具体松开时间 阈值
- 组合 : 弦操作的Plus版本 ,可以指定 另外数个动作不同阶段 在触发或者非触发状态下才能 通过按键触发当前动作。 例如只能在 没有移动 的情况下 蹲下
- 脉冲 : 当长按时 以一定时间间隔触发 ,例如 实现每隔0.2秒触发一次 最多触发 n 次 | PS:如果单击的话将触发一次
- 长按 : 嗯!长按时候持续触发 可以设置长按多久触发
- 长按和松开 : 在长按后 松开时候 触发一次
蓝图应用
添加映射上下文
通过 获取 玩家控制器 来 添加\移除 映射上下文。
其中 Priority 为优先级 高优先级优先触发 并且将影响上文提到的按键消耗
输入动作事件
名称 | 解释 |
---|---|
Triggered | 当触发时调用(即满足上文中提到的触发器的条件) |
Started | 当绑定的按键按下时调用(不论是否达到触发条件都会调用) |
Ongoing | 当绑定的按键按下时 并且未触发 持续调用 |
Canceled | 当绑定的按键按下但是没能达到触发条件时调用 |
Completed | 当触发事件结束后调用 |
Action Value | 输入对应的输入值 |
Elapsed Seconds | 经过的时间:从按下按键经过的时间 |
Triggered Seconds | 触发的时间:从触发开始经过的时间 |
Input Action | 触发的输入动作名称 |
举个例子
如图当调用这个 长按 W 的时候 调用顺序如下
--------------------------------------- 按下按键 —
Started (一次)
Ongoing (持续一秒)
Triggered (持续触发)
--------------------------------------- 松开按键 ----
Completed (触发一次)
--------------------------------------- 按下按键 —
Started (一次)
Ongoing (持续触发)
--------------------------------------- 在触发前松开按键 ----
Canceled(一次)