虚幻引擎的运动系统构建实例,包括了人物移动、视角移动、跳跃、疾跑的内容,以及一些相关的注意事项。
由于人懒加上事多,所以对于虚幻引擎的上手一再被搁置,但依然要挤出一些时间记录一下学习的成果。我希望我能够在不久的将来构造出一个属于我自己的小DEMO。
我在之前已经阐述了增强输入系统,这是虚幻引擎的新特性,相较于传统的轴/按键映射,它更加灵活,并且更加方便按需加载。我在这里就以最简单的增强输入系统应用为例,搭建一个运动系统。
需要创建的资源包括了新的项目,基本的蓝图等等。我创建的内容如下:
本文将忽略文件夹格式,我不关心路径,只关心文件(类)之间的相互关系。
另外,不要忘了修改世界选项,将角色改为我们自己的BP_St_Character。
输入操作,顾名思义,这个定义了一个触发的动作的名字,以及触发的数据。名字我们很好理解,可以直接从文件名中得知该动作的名字,但是触发数据该如何理解?
打开输入操作文件,我们能看到“操作 - 值类型”中,有三个可选项:
我们一般将一些代表状态的输入(例如跳跃、疾跑)等设置为布尔(即存在),如:
其实,我们的“向左走,向右走”也可以是两个布尔值,但是我们这样想:向左走,不就是反向的向右走吗?这个时候状态不只有0和1,还有-1,那么我们就可以将两个互相为相反操作的行为看做一个Vector1D(即数轴)的映射:
再比如,鼠标的移动,既有上下,又有左右。我们当然可以将它写成4个布尔值,但也可以写成两个Vector1D的值,那自然也可以将它写成1个Vector2D(即方向)的映射:
我们创建了输入上下文BP_InputContext,用它来对具体的触发规则进行规定。
打开BP_InputContext,我们可以点击映射二字右边的加号新建映射,并且选择我们希望映射的动作:
选中新的动作之后,点击动作右边的加号,新建绑定的按键:
关于触发器和修改器的内容,以及相关的属性,可以参考虚幻引擎入门 - 增强输入系统,这里不再赘述。
触发器通常来说都进行“下移”的绑定即可。下移会在按下时持续触发。但是通常来说我更建议把跳跃设置成“已按下”,因为“下移”状态下长按可能会导致连跳,但是“已按下”只会在按下的时候触发一次。
同样需要注意的还有向前移动和向右移动。以向前移动举例,我们如果不对其进行任何修改器的处理,点击“W”和点击“S”都会导致触发器返回“1”。但是我们希望它能够返回“-1”(向后)、“0”(静止)、“1”(向前)三种状态。因此,我们需要对“S”取反,以让它返回一个相反的值,方便我们后续的处理。向右移动也是同样的道理。
最后是鼠标的映射,因为它是个Vector2D的值,因此我们需要再下拉菜单中选择“鼠标 - 鼠标XY 2D轴”。因为它时刻都有返回(返回运动方向),因此我们无需对其进行触发器和修改器的规定。
注意:如果你的鼠标Y轴会反转,可以使用修改器反转Y轴。
至此,我们对输入动作和输入上下文的配置均已完成,接下来该对角色的蓝图进行修改。
打开角色蓝图BP_St_Character,在右上角的添加中选择Spring Arm,并在Spring Arm下再添加一个Camera。Spring Arm长度调整为0,则其变成一个第一人称游戏,如果有长度则可以变成第三人称游戏。
在BP_St_Character的Detail面板中勾选“使用控制器旋转Pitch”。
在SpringArm的Detail面板中勾选“继承Pitch”。
打开BP_St_Character的蓝图,并在BeginPlay中导入增强输入系统:
前进后退、向左向右都比较简单,可以用自带的API完成:
注意:
这里的Scale Value就是变化倍率,如果为-1则会向相反方向移动,正是基于此,我们给出了使用Vector1D配合修改器的解决方案。
视角的切换也可以比较简单的完成,尤其是水平方向(Yaw),可以直接使用自带的API完成。
垂直方向本来也可以,但是它很容易在边界出现视角BUG,因此我们需要对其最大值和最小值进行限制,我在这里将其限制到了-89度和89度,防止它出现边界BUG。同时,为了界面简洁,我将其折叠为了函数Set Controller Pitch With Limit
。
函数展开后的样子如图:
算法思想:获取当前Camera的旋转信息,并将其分裂成XYZ三个轴,只对Y轴的数据进行相加,并检测它的边界是否合法,返回合法值或边界值,最终设置为新的值。其实就是加了一个边界检查,其他的和水平方向的设置是一样的。
跳跃与疾跑的逻辑也也很相似,只不过我分别使用了布尔值来记录它们的状态,以保证我可以在之后进行状态管理:
需要注意的是,疾跑的右侧的SET并不是简单的SET变量,而是SetMaxWalkSpeed
,是Character Movement暴露出来的接口,用于设置人物的最高速度。
至此,我们的人物已经可以在世界中移动、转换视角、跑、跳了。其实这部分内容与其说是要写在Character蓝图里,其实更适合写在Controller蓝图里,但是我上手时是用的Character,因此就没有修改。
如果有机会打算之后写场景物品互动。
本文作者:Jeff Wu
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!