2024-10-16
Unreal Engine
00

目录

创建资源
配置数据
配置输入操作
配置输入上下文
蓝图修改
总结

虚幻引擎的运动系统构建实例,包括了人物移动、视角移动、跳跃、疾跑的内容,以及一些相关的注意事项。

由于人懒加上事多,所以对于虚幻引擎的上手一再被搁置,但依然要挤出一些时间记录一下学习的成果。我希望我能够在不久的将来构造出一个属于我自己的小DEMO。

我在之前已经阐述了增强输入系统,这是虚幻引擎的新特性,相较于传统的轴/按键映射,它更加灵活,并且更加方便按需加载。我在这里就以最简单的增强输入系统应用为例,搭建一个运动系统。

创建资源

需要创建的资源包括了新的项目,基本的蓝图等等。我创建的内容如下:

  1. 新建项目:Project_St
  2. 新建文件:BP_St_Gamemode(蓝图类 - 游戏模式基础)
  3. 新建文件:BP_St_Controller(蓝图类 - 玩家控制器)
  4. 新建文件:BP_St_Character(蓝图类 - 角色)
  5. 新建文件:BP_InputJump(输入 - 输入操作)
  6. 新建文件:BP_InputLook(输入 - 输入操作)
  7. 新建文件:BP_InputSprint(输入 - 输入操作)
  8. 新建文件:BP_InputWalkForward(输入 - 输入操作)
  9. 新建文件:BP_InputWalkRight(输入 - 输入操作)
  10. 新建文件:BP_InputContext(输入 - 输入映射情境)

本文将忽略文件夹格式,我不关心路径,只关心文件(类)之间的相互关系。

另外,不要忘了修改世界选项,将角色改为我们自己的BP_St_Character。

配置数据

配置输入操作

输入操作,顾名思义,这个定义了一个触发的动作的名字,以及触发的数据。名字我们很好理解,可以直接从文件名中得知该动作的名字,但是触发数据该如何理解?

打开输入操作文件,我们能看到“操作 - 值类型”中,有三个可选项:

  • 布尔
  • Vector1D
  • Vector2D
  • Vector3D

我们一般将一些代表状态的输入(例如跳跃、疾跑)等设置为布尔(即存在),如:

  • BP_InputJump(跳跃动作)
  • BP_InputSprint(疾跑动作)

其实,我们的“向左走,向右走”也可以是两个布尔值,但是我们这样想:向左走,不就是反向的向右走吗?这个时候状态不只有0和1,还有-1,那么我们就可以将两个互相为相反操作的行为看做一个Vector1D(即数轴)的映射:

  • BP_InputWalkForward(前后行走动作)
  • BP_InputWalkRight(左右行走动作)

再比如,鼠标的移动,既有上下,又有左右。我们当然可以将它写成4个布尔值,但也可以写成两个Vector1D的值,那自然也可以将它写成1个Vector2D(即方向)的映射:

  • BP_InputLook(鼠标视角移动动作)

配置输入上下文

我们创建了输入上下文BP_InputContext,用它来对具体的触发规则进行规定。

打开BP_InputContext,我们可以点击映射二字右边的加号新建映射,并且选择我们希望映射的动作:

image.png

选中新的动作之后,点击动作右边的加号,新建绑定的按键:

image.png

关于触发器和修改器的内容,以及相关的属性,可以参考虚幻引擎入门 - 增强输入系统,这里不再赘述。

触发器通常来说都进行“下移”的绑定即可。下移会在按下时持续触发。但是通常来说我更建议把跳跃设置成“已按下”,因为“下移”状态下长按可能会导致连跳,但是“已按下”只会在按下的时候触发一次。

同样需要注意的还有向前移动和向右移动。以向前移动举例,我们如果不对其进行任何修改器的处理,点击“W”和点击“S”都会导致触发器返回“1”。但是我们希望它能够返回“-1”(向后)、“0”(静止)、“1”(向前)三种状态。因此,我们需要对“S”取反,以让它返回一个相反的值,方便我们后续的处理。向右移动也是同样的道理。

image.png

最后是鼠标的映射,因为它是个Vector2D的值,因此我们需要再下拉菜单中选择“鼠标 - 鼠标XY 2D轴”。因为它时刻都有返回(返回运动方向),因此我们无需对其进行触发器和修改器的规定。

注意:如果你的鼠标Y轴会反转,可以使用修改器反转Y轴。

image.png

至此,我们对输入动作和输入上下文的配置均已完成,接下来该对角色的蓝图进行修改。

蓝图修改

打开角色蓝图BP_St_Character,在右上角的添加中选择Spring Arm,并在Spring Arm下再添加一个Camera。Spring Arm长度调整为0,则其变成一个第一人称游戏,如果有长度则可以变成第三人称游戏。

在BP_St_Character的Detail面板中勾选“使用控制器旋转Pitch”。

在SpringArm的Detail面板中勾选“继承Pitch”。

打开BP_St_Character的蓝图,并在BeginPlay中导入增强输入系统:

image.png

前进后退、向左向右都比较简单,可以用自带的API完成:

image.png

注意:

这里的Scale Value就是变化倍率,如果为-1则会向相反方向移动,正是基于此,我们给出了使用Vector1D配合修改器的解决方案。

视角的切换也可以比较简单的完成,尤其是水平方向(Yaw),可以直接使用自带的API完成。

image.png

垂直方向本来也可以,但是它很容易在边界出现视角BUG,因此我们需要对其最大值和最小值进行限制,我在这里将其限制到了-89度和89度,防止它出现边界BUG。同时,为了界面简洁,我将其折叠为了函数Set Controller Pitch With Limit

函数展开后的样子如图:

image.png

算法思想:获取当前Camera的旋转信息,并将其分裂成XYZ三个轴,只对Y轴的数据进行相加,并检测它的边界是否合法,返回合法值或边界值,最终设置为新的值。其实就是加了一个边界检查,其他的和水平方向的设置是一样的。

跳跃与疾跑的逻辑也也很相似,只不过我分别使用了布尔值来记录它们的状态,以保证我可以在之后进行状态管理:

image.png

需要注意的是,疾跑的右侧的SET并不是简单的SET变量,而是SetMaxWalkSpeed,是Character Movement暴露出来的接口,用于设置人物的最高速度。

总结

至此,我们的人物已经可以在世界中移动、转换视角、跑、跳了。其实这部分内容与其说是要写在Character蓝图里,其实更适合写在Controller蓝图里,但是我上手时是用的Character,因此就没有修改。

如果有机会打算之后写场景物品互动。

本文作者:Jeff Wu

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!