文章目录
- 概要
- Enhanced Input系统基础
- 回顾旧版输入系统
- 定义物理按键和Action/Axis的映射
- 输入事件
- Enhanced Input系统
- 统一的Action
- Input Mapping Context
- 输入事件
- 《Crop Out》
- 《Crop Out》中基于Enhanced Input的输入控制系统
- Input Mapping Context分层管理
- 输入修改器(Input Modifier)
- 预设输入修改器
- 《Crop Out》中的自定义输入修改器
- 一些琐碎的知识点
- 如何判断当前控制器类型
概要
在上一篇文章《虚幻官方项目《CropOut》技术解析 之 程序化岛屿生成器(IslandGenerator)》我们介绍了《CropOut》中使用Geometry Script程序化生成每个关卡的岛屿。今天再来聊一聊Enhanced Input,Enhanced Input是虚幻官方想用《Crop Out》诠释的技术要点之一。其实在去年虚幻官方的直播节目中,虚幻官方已经对Enhanced Input作了比较全面深入的介绍,本文将重点分析《CropOut》中基于Enhanced Input的输入控制系统。
Enhanced Input系统基础
为了便于没接触过Enhanced Input的朋友阅读,先介绍一下这个系统,已经熟悉Enhanced Input的朋友可以跳过这个部分。
回顾旧版输入系统
定义物理按键和Action/Axis的映射
旧版输入系统大家都不陌生,我们在Engine>Input中配置Action/Axis
和物理按键的对应关系
上述配置会静态记录在DefaultInput.ini文件中
输入事件
接下来DefaultInput.ini中定义的Action
会被反射到蓝图中成为输入事件,当运行时有相应的物理按键被按下就会触发后面的游戏逻辑
把上述映射关系抽象出来其实就是:
旧版输入系统我们用了很久,并没有觉得有什么不妥,遇到一些问题也有成熟的解决方案,那么新版的“提升”在于哪些方面呢?
Enhanced Input系统
从使用的角度,新的Enhanced Input系统有几个最显著的变化:
统一的Action
将之前的Action与Axis统一为Action,并且使用Input Action资源来定义它们,每个Input Action资源文件定义了一个Action:
Input Mapping Context
使用Input Mapping Context资源文件定义物理按键和Action的映射关系等信息:
Input Mapping Context资源文件的内容很像旧系统中配置Action/Axis
和物理按键的对应关系的界面。并且一个项目可以配置多个Input Mapping Context
输入事件
同样的,当运行时有相应的物理按键被按下就会触发后面的游戏逻辑,我们可以看到输入事件有了更多更细分的状态引脚
把上述映射关系抽象出来其实就是:
上述改变的意义是什么呢?由于Input Mapping Context是资源文件,于是就允许我们在游戏的运行时对Input Mapping Context进行动态装卸,每个Input Mapping Context都是一组Action
的集合,只有当Action
所属Input Mapping Context被加载,该Action
才会被触发。所以每一个Input Mapping Context其实就是一个输入模块。
这样我们就可以轻松列举出Enhanced Input系统模块化的几大优点了:
- 在不同的模式(状态)下可以加载对应的Input Mapping Context,很方便地隔离不同模式(状态)下输入事件触发的游戏逻辑
- 可以对Input Mapping Context分层管理(在《Crop Out》中会有例子)
- 运行时系统只需要轮询当前加载的Input Mapping Context中的Action,一定成度上提升了效率
- 刚才说到更多更细分的状态引脚也节省了我们很多代码
当然Enhanced Input系统的提升还不止是这些。接下来我们结合虚幻官方示例项目《Crop Out》尝试在实战中理解Enhanced Input系统。
《Crop Out》
在阅读下文之前建议先上手试玩一下《Crop Out》或者看一下官方的导览视频
[教程]《Cropout》休闲RTS示例项目导览(官方字幕)
游戏中的Player是实际是一个如下图所示的Pawn
《Crop Out》中基于Enhanced Input的输入控制系统
Input Mapping Context分层管理
《Crop Out》中一共包含4个Input Mapping Context并且按照他们的有效周期可以分成了3个层次:
BP_Player
- 第1层
IMC_BaseInput
:在游戏运行中全程有效,包含使用键盘、Gamepad、鼠标滚轮实施屏幕移动、缩放、旋转操作
- 第2层
IMC_Villager_Mode
和IMC_BuildMode
:分别在Villager Mode和Build Mode有效,对应着两种模式下的不同操作方式
- 第3层
IMC_DragMove
:用鼠标和触摸屏实施的拖拽操作,仅在Villager模式的特定条件下有效。
输入修改器(Input Modifier)
Enhanced Input还提供了输入修改器(Input Modifier),允许用户将初始值程序化地映射(修正)成新的值,并且多个输入修改器还可以串联起来形成队列,从而应对更复杂的需求。
预设输入修改器
Enhanced Input提供了一系列的预设输入修改器
- DeadZone:限定值的范围
- Scalar: 缩放一个标量
- Negate: 取反
- Smooth: 多帧之间平滑
- CurveExponential: 指数曲线,XYZ
- CurveUser: 自定义指数曲线,CurveFloat
- FOVScaling: FOV缩放
- ToWorldSpace: 输入设备坐标系向世界坐标系转换 (调换XYZ顺序)
- SwizzleAxis: 互换轴值
- Collection: 嵌套子修改器集合
《Crop Out》中的自定义输入修改器
还可以自定义输入修改器,《Crop Out》中自定义了2个输入修改器,分别使用在下图所示的位置:
它们分别是对出,触摸屏设备的手势操作的初始值进行归一化以及偏移修正。
IM_Normalize
IM_Offset
一些琐碎的知识点
如何判断当前控制器类型
BP_PC(Player Controller)