4 - 玩家输入系统
光速过一遍蓝图编程,本文将光速过一遍有关蓝图中玩家输入的如下内容:
- 经典输入系统;
- 增强输入系统;
经典输入系统
由于我用的是UE5.4引擎,第一人称射击模板中的BP_FirstPersonCharacter
已经是增强输入系统了,这里的配图就用参考资料中的了。应该会按两套输入系统抄/魔改参考资料两次。
分解玩家动作
经典输入系统将移动摄像机这一操作按设备分成两种输入:
按摇杆输入:如下图所示,上下两组节点分别控制摄像机朝左右,朝上下看的操作,偏转的速度由基本速率乘上Delta Time得到,以避免帧率不同带来的影响。
按鼠标输入:将鼠标移动输入转换为数据,然后直接传递给相关节点。
经典输入系统处理玩家移动操作的逻辑如下:
Select节点用于测试玩家是否在使用VR设备,如果是的话使用的方向向量来自First Person Camera
,否则来自根组件Actor
。然后将方向向量添加到角色移动偏移节点中,与输入的偏移值配合。
经典输入系统处理玩家跳跃操作的逻辑如下:
按下跳跃输入时执行跳跃函数,放开时执行停止跳跃函数。
自定义控制输入
接下来尝试添加如下两个自定义输入:
- 给角色移动添加冲刺功能,让它按下Shift键奔跑,松开取消。
- 给摄像头添加缩放功能,让它按下鼠标右键聚焦,松开取消。
首先需要在“项目设置-引擎-输入”中添加操作映射(Action Mappings)。在这个面板中可以发现有操作映射和轴映射(Axis Mappings)两项,它们的释义如下:
- 操作映射:触发玩家动作的按键和鼠标点击事件;
- 轴映射:具有一定范围的玩家动作和事件,例如W键和S键都影响前进,但结果不一样。
这里的两个自定义输入都是按键点击触发,因此添加操作映射即可:
然后就能在角色事件蓝图中实现输入处理逻辑了,冲刺功能的实现如下:
按下Shift时,设置玩家移动组件中的最大行走速度为2200;松开Shift后,设置玩家移动组件中的最大行走速度为600。
最后是实现摄像机按下右键就能聚焦的逻辑,需要设置摄像机的FOV值:
当我们这样实现进入游戏后,发现按一下右键马上就摄像机聚焦了,太突兀了没有平滑变换,我们需要 时间轴(TimeLine)节点来让摄像机聚焦的过程平滑起来。
使用时间轴可以方便实现一些简单动画效果,例如开门的旋转动画。但对于更加复杂的动画(如过场CG)则需要使用Sequencer。
在时间轴中添加浮点数轨道FOV,通过Shift+鼠标左键添加关键点,0s时为90,0.3s时为45:
最终蓝图如下:
增强输入系统
上面经典输入系统教程的增强输入版本。
分解玩家动作
增强输入系统增加了对输入设备的抽象,让我们只关注输入操作,而不是按设备分类实现输入逻辑。因此它对相机输入的实现也就只有一种,即根据输入的X和Y轴值进行相机移动:
同理,角色移动输入也变得简单了些:
角色跳跃输入和之前的相同:
自定义控制输入
接下来尝试添加如下两个自定义输入:
- 给角色移动添加冲刺功能,让它按下Shift键奔跑,松开取消。
- 给摄像头添加缩放功能,让它按下鼠标右键聚焦,松开取消。
增强输入系统中玩家的输入动作被称为一个InputAction
,它相当于输入设备的抽象,只关心输出结果,而不关心用什么设备什么按键输入。这有利于我们专注游戏逻辑的实现,而不是如何分类处理输入。
接下来在Contents/FirstPerson/Input
中创建两个InputAction
,它们的值类型都是Digital(bool)
,因为是按键触发:
接下来就要设置这两个操作该用什么按键输入了。增强输入系统提供了输入映射上下文(Input Mapping Context)这一概念,它定义了玩家在特定上下文中的一组输入动作(如在无载具时可以行走、奔跑;在有载具时只能开车),并指定这些输入动作的按键是什么。
在第一人称射击模板中找到IMC_Default
,添加我们刚创建的两个输入动作:
最后就要在蓝图中实现这两个操作的逻辑了:
增强输入系统中还有很多概念,例如触发器修饰器什么的,详见官方文档,或者我UE5C++入门系列文章中的《玩家输入入门》。
参考资料
- 中文翻译:《UE5蓝图可视化脚本游戏开发完全学习教程》
- 英文原版:《Blueprints Visual Scripting for Unreal Engine 5 Third Edition》