4 - 玩家输入系统

光速过一遍蓝图编程,本文将光速过一遍有关蓝图中玩家输入的如下内容:

  • 经典输入系统;
  • 增强输入系统;

经典输入系统

由于我用的是UE5.4引擎,第一人称射击模板中的BP_FirstPersonCharacter已经是增强输入系统了,这里的配图就用参考资料中的了。应该会按两套输入系统抄/魔改参考资料两次。

分解玩家动作

经典输入系统将移动摄像机这一操作按设备分成两种输入:

  1. 按摇杆输入:如下图所示,上下两组节点分别控制摄像机朝左右,朝上下看的操作,偏转的速度由基本速率乘上Delta Time得到,以避免帧率不同带来的影响。

  2. 按鼠标输入:将鼠标移动输入转换为数据,然后直接传递给相关节点。

经典输入系统处理玩家移动操作的逻辑如下:

Select节点用于测试玩家是否在使用VR设备,如果是的话使用的方向向量来自First Person Camera,否则来自根组件Actor。然后将方向向量添加到角色移动偏移节点中,与输入的偏移值配合。

经典输入系统处理玩家跳跃操作的逻辑如下:

按下跳跃输入时执行跳跃函数,放开时执行停止跳跃函数。

自定义控制输入

接下来尝试添加如下两个自定义输入:

  1. 给角色移动添加冲刺功能,让它按下Shift键奔跑,松开取消。
  2. 给摄像头添加缩放功能,让它按下鼠标右键聚焦,松开取消。

首先需要在“项目设置-引擎-输入”中添加操作映射(Action Mappings)。在这个面板中可以发现有操作映射和轴映射(Axis Mappings)两项,它们的释义如下:

  • 操作映射:触发玩家动作的按键和鼠标点击事件;
  • 轴映射:具有一定范围的玩家动作和事件,例如W键和S键都影响前进,但结果不一样。

这里的两个自定义输入都是按键点击触发,因此添加操作映射即可:

然后就能在角色事件蓝图中实现输入处理逻辑了,冲刺功能的实现如下:

按下Shift时,设置玩家移动组件中的最大行走速度为2200;松开Shift后,设置玩家移动组件中的最大行走速度为600。

最后是实现摄像机按下右键就能聚焦的逻辑,需要设置摄像机的FOV值:

当我们这样实现进入游戏后,发现按一下右键马上就摄像机聚焦了,太突兀了没有平滑变换,我们需要 时间轴(TimeLine)节点来让摄像机聚焦的过程平滑起来。

使用时间轴可以方便实现一些简单动画效果,例如开门的旋转动画。但对于更加复杂的动画(如过场CG)则需要使用Sequencer。

在时间轴中添加浮点数轨道FOV,通过Shift+鼠标左键添加关键点,0s时为90,0.3s时为45:

最终蓝图如下:

增强输入系统

上面经典输入系统教程的增强输入版本。

分解玩家动作

增强输入系统增加了对输入设备的抽象,让我们只关注输入操作,而不是按设备分类实现输入逻辑。因此它对相机输入的实现也就只有一种,即根据输入的X和Y轴值进行相机移动:

同理,角色移动输入也变得简单了些:

角色跳跃输入和之前的相同:

自定义控制输入

接下来尝试添加如下两个自定义输入:

  1. 给角色移动添加冲刺功能,让它按下Shift键奔跑,松开取消。
  2. 给摄像头添加缩放功能,让它按下鼠标右键聚焦,松开取消。

增强输入系统中玩家的输入动作被称为一个InputAction,它相当于输入设备的抽象,只关心输出结果,而不关心用什么设备什么按键输入。这有利于我们专注游戏逻辑的实现,而不是如何分类处理输入。

接下来在Contents/FirstPerson/Input中创建两个InputAction,它们的值类型都是Digital(bool),因为是按键触发:

接下来就要设置这两个操作该用什么按键输入了。增强输入系统提供了输入映射上下文(Input Mapping Context)这一概念,它定义了玩家在特定上下文中的一组输入动作(如在无载具时可以行走、奔跑;在有载具时只能开车),并指定这些输入动作的按键是什么。

在第一人称射击模板中找到IMC_Default,添加我们刚创建的两个输入动作:

最后就要在蓝图中实现这两个操作的逻辑了:

增强输入系统中还有很多概念,例如触发器修饰器什么的,详见官方文档,或者我UE5C++入门系列文章中的《玩家输入入门》。

参考资料

  • 中文翻译:《UE5蓝图可视化脚本游戏开发完全学习教程》
  • 英文原版:《Blueprints Visual Scripting for Unreal Engine 5 Third Edition》