人物碰撞检测

在这一篇文章中,我们增加一个左右移动的立方体,将其作为障碍。人物角色必须躲避这个障碍,否则会被推着走。

添加立方体的方法,和上一篇文章 《蓝图继承 C++ 类》 中介绍的一样:我们在“内容侧滑菜单”中找到实现移动功能的 C++ 类,右击选择 创建基于...的蓝图类。这边我们将新的蓝图类命名为 BP_PushingCube。

在 BP_PushingCube 蓝图编辑窗体中,我们为它添加想要的 Mesh,调整基础属性。这样移动的立方体就制作完毕了。

我们添加 BP_PushingCube 到场景中,进行效果查看。会发现当人物处于静止状态,移动的立方体和人物接触时,画面会发生穿透错位。

这是没有进行碰撞检测导致的。当前模板中的人物角色使用 Unreal Engine 提供的官方组件 Character MovementCharacter Movement 组件封装了大量的移动和物理计算逻辑,方便开发者使用。

MoveUpdatedComponentCharacter Movement 类中的一个方法,用于更新角色的移动组件。在移动过程中,MoveUpdatedComponent 会进行碰撞检测,确保角色不会穿透其他物体。

穿透只会在人物角色静止的时候发生,是因为静止的时候没有调用 MoveUpdatedComponent 方法。为了解决这个问题,如图 1 所示,在每次 tick 时,我们强制调用 MoveUpdatedComponent 方法,让角色移动一小段距离,再移动回来。最终结果是,人物角色没有移动,但是触发了碰撞检测。同时注意使用 Get Actor Rotation 更新 New Rotation,否则人物的朝向会固定不变。

这个方法看着比较 trick,不知道有没有其他方法。留作问题。

图1 角色蓝图

在解决人物角色碰撞问题后,我们可以继续完善我们的场景。如下方视频所示,我们搭建了一个闯关场景:角色需要通过上下移动的石柱,走到新的平台,然后躲过移动的立方体。