[UE4]虚幻4引擎实现类似永劫无间的钩锁系统
基于UE4实现类似永劫无间的钩锁系统,主要介绍一下思路,抛砖引玉,欢迎交流!
项目展示https://www.bilibili.com/video/BV16S4y1S7GU?share_source=copy_web
总览
总体使用有限状态机实现,包括状态内处理和状态转换两部分。
为表述清晰,后文将钩锁连接在人物一端称为A端,发射出去的一端称为B端
钩锁利用UE4自带的Cable组件实现,比较重要的是两个参数
Location
和End Location
分别为钩锁两端的位置,我们利用前者作为B端,后者作为A端
有限状态机:
转换箭头的两侧分别为状态转换的条件和状态转换时进行的(主要)操作,高亮为输入信号
包含四个状态:其他状态、瞄准状态、钩锁发射状态、人物移动状态
其中后三个状态内皆需要进行状态内处理(每帧):
瞄准状态:
进行射线检测,检测距离内钩锁能否命中,若能命中则改变准星的形状
钩锁发射状态:
每帧改变钩锁B端的位置,实现发射的效果
人物移动状态:
- 由于钩锁在
ThirdPersonCharacter
内,因此随人物移动,钩锁也会改变位置,所以要根据人物移动改变钩锁位置,实现钩锁B端的固定效果 - 随人物向钩锁B端移动缩短钩锁长度
- 给人物一个朝向钩锁B端的速度,使之朝B端移动
- 检测移动过程中是否被阻挡
实现细节
瞄准
瞄准逻辑
实现按Q键进行瞄准,当钩锁能够命中时改变准星的形状,瞄准时缩小Field Of View
因为牵扯到HUD的变化,我们用蓝图接口传递两个布尔变量到HUD,分别表示是否在瞄准状态和钩锁能否命中。根据这两个变量值决定是否绘制准星和准星的形状
HUD蓝图:
瞄准时缩小视角利用两个事件来控制,以便当视角变化到一半停止瞄准也能正常回到正常视角而不是跳变
瞄准的输入控制
与其他输入不同,瞄准的输入在钩锁发射和人物移动过程中是要关闭的(发射钩锁时让视角回到正常状态)
利用一个Gate
实现输入控制,同时还可以进行与HUD蓝图的通信
状态0–其他状态
状态0内不需要做任何处理,只需根据输入转换状态即可
状态1–瞄准状态
状态内处理
状态1中需要进行射线检测,检测射程内钩锁能否命中,并将检测结果以变量的形式保存下来,命中结果发送给HUD
状态转换
两种情况,一种松开Q键回到状态0,一种进入钩锁发射状态
进入钩锁发射状态时需要顺序执行四个操作
- 关闭瞄准状态
- 设置钩锁B端的位置(若命中则设置为命中位置,未命中则设置为最远距离
- 改变角色朝向,令角色朝向摄像机位置
- 播放钩锁发射的动画,为保证发射动画过程中角色处于静止,此处将
Movement Mode
设置为None
状态2–钩锁发射状态
状态内处理
在钩锁移动完成之前,需要每帧更新钩锁B端位置,以实现发射的动画效果,使用VInterp To
节点实现平滑过渡
状态转换
钩锁移动完成后,首先改回Movement Mode
- 若未命中则收回钩锁后回到状态0,同样使用
VInterp To
节点
- 若命中则进行一次跳跃并进入状态3
其中Do once
节点通过Reset Hook
事件重置
此事件用于重置相关变量,便于下次的钩锁发射
状态3–人物移动状态
状态内处理
人物移动完成前
- 需要每帧改变钩锁B端的位置,以保证钩锁B端在世界坐标下的固定效果
- 随着人物的移动缩短钩锁的长度
- 给人物一个向着钩锁B端位置的速度,移动人物。其中这个速度越靠近B端越小
- 检测前方是否有阻挡,若有阻挡,需将人物的移动速度降低
状态转换
三种情况下人物移动完成,重置钩锁,回到状态0
- 按下空格,主动终止,此时需降低人物速度
- 有物体阻挡
- 人物离钩锁B端够近
结语
至此就完成了一个类似永劫无间的钩锁系统了,在此基础上还可以加上攀爬系统,并设置二段跳实现更灵活的移动
参考资料
https://www.bilibili.com/video/BV1Zt411D7Zt?share_source=copy_web
攀爬系统:https://www.bilibili.com/video/BV1yb4y1o7BY?share_source=copy_web