「终末地」滑索功能复刻
制作时间:2026年2月中 · 开发周期:3天
今年春节的时候为了做关卡,复刻了一个终末地滑索功能。虽然缺少对应状态下的动画效果,但实际的功能大差不差了,简单记录一下思路。
文章目录
- 功能拆解
- 前言:对象蓝图设定
- 进入范围后显示交互UI
- 允许玩家交互
- 交互后播放Entering动画并进入Selecting
- 进入Selecting后选择目标滑索点
- 实时选择滑索点的算法
- 确认选择,开始滑行,抵达终点
- 退出Selecting,清空状态
功能拆解
首先来看看终末地滑索的原版效果:
从功能层面拆解,滑索系统包含以下核心逻辑:
- 进入交互范围后显示UI
- 显示UI后允许玩家交互
- 交互后玩家位移到指定位置并播放Entering动画
- 播放完毕Entering动画后,可以自由选择范围内的滑索点
- 同屏幕内出现多个滑索点时,根据屏幕中心距离测算,选择更近的滑索点作为位移目标
- 确定滑索目标后开始滑行并播放Sliding动画,抵达后允许再次交互退出或选择下一个滑索点
- 选择退出后播放Exiting动画并清空状态
前言:对象蓝图设定
对于关卡来说,这类交互物最好都做成独立的预制体,方便随时取出来即插即用。
因此我首先做了一个 BP_ZipLineTerminal 的对象蓝图,这个对象蓝图将会承载所有围绕滑索的功能。
一、进入范围后显示交互UI
在滑索类里,首先需要登上滑索的功能。登上滑索首先需要看到滑索的交互提示,因此我先做了一个交互UI,并且连了一个靠近范围后显示UI的蓝图逻辑。
- 交互UI是单独的WBP组件,其中可以控制显示时候的动画,以及消失时候的动效。
- 靠近后显示UI的逻辑写在滑索的类里面,作为一个Function函数。写一个判断,在规则内就可见,不然就不可见。
- 添加一个
InteractionSphere的球形碰撞体,在 EventGraph 里面用碰撞体重合来判断是否 ShowUI 的条件。
- 当我进入过一次范围后,再离开范围,UI不会消失,因此还需要一个关掉UI的逻辑。
二、允许玩家交互
为了便于管理玩家和滑索交互过程中处于一个比较可控的状态,这里使用状态机。
新建一个 Enum 并枚举五个状态,确保玩家在五个状态下的行为不会打架(比如在滑行的过程中不能退出状态,得等到抵达下一个滑索点的时候才能退出):
- Normal:空状态
- Entering:登上滑索的开始状态
- Selecting:登上滑索后,可以自由选择目标点的状态
- Riding(Sliding):选择好目标点并出发后开始滑行的状态
- Exiting:从滑索上退出的状态
玩家的初始状态是 Normal。当我进入可交互范围显示出UI后,按下对应的按键便进入 Entering。
绑定一个交互键 E(Project Setting → Engine Input → Action Mappings):
三、交互后播放Entering动画并进入Selecting
状态机写在角色蓝图里。此前尝试都写在滑索类里,但最后发现状态会反复叠加无法切换。
输入 Interact 后,判定交互范围并判定当前自身状态:
- 如果是 Normal,则进入 Entering 播放动画,进入 Selecting
- 如果已经是 Selecting,则进入 Exiting 播放动画,回到 Normal(清空状态)
Entering 状态下,把角色移动绑定到 Terminal 的组件上(想象一下角色拉着缆绳上升位置)。
角色的 Entering 动画 = 从滑索底部特定位置向上以需要的速度进行移动。
为了让 Entering 位移动画足够平滑,这里用的是 Timeline。设定好 Value 以及 Time,速度 = Value / Time。
四、进入Selecting后选择目标滑索点
宏观层面来看,玩家进入 Selecting 后,实时判断可选择的滑索点,显示可选择的UI效果。
五、实时选择滑索点的算法
算法核心:判断哪个滑索点和我的画面中心点最近,把距离我最近的滑索点实时输出出来。
六、确认选择,开始滑行,抵达终点
Action Mappings 里增加一个确认选择的按键。点击后,玩家开始滑行,滑行效果依然用的是 Timeline。
抵达终点后,玩家回到 Selecting 状态。
七、退出Selecting,清空状态
参考 Normal → Entering → Selecting → Exiting → Normal 时的判定即可。
后记
大概逻辑就是上述的这些。实际终末地的开发应该会有更加体系化的方案来做这个功能,会有更加清晰的管理动画+人物状态+交互物的工具。
但我不会嘻嘻,先这样吧,用着再说。
具体做的过程中,由于有很多跑测过程中的bug问题,所以虽然思路是这样,但还有很多细节点我记不清了,当时修完了觉得能用就行了。 ^^
本文由 水跃鱼 撰写 | GLM-4(智谱AI)协助排版