我的第一个 UE5 第三人称闯关游戏
回头来看,这个项目其实并不复杂。
没有复杂的战斗系统,没有多人联机,也没有自己设计什么庞大的游戏架构。它甚至不是一个完全由我独立构思出来的游戏,只是跟着潮流,一点一点完成的第三人称动作闯关 Demo。
但如果让我重新回顾自己的 UE 学习经历,我反而觉得这个项目很重要。
因为它大概是我第一次产生这样一种感觉:
原来我真的可以把 Unreal Engine 里面那些零零散散的东西,组合成一个能够从头玩到尾的游戏。
从“让角色动起来”开始
刚开始的时候,目标其实非常简单。
先让角色能够正常操作,再把基础动画跑起来。
移动、转向、跳跃……
现在再看这些东西当然非常基础,但当时对于刚开始真正接触 UE Gameplay 的我来说,它们就是游戏世界开始“活起来”的第一步。
尤其是跳跃。
游戏开发里很多看起来理所当然的事情,真正自己做的时候才会发现,它们背后其实都有一整套逻辑。
角色什么时候算在地面?
什么时候允许再次跳跃?
动画应该什么时候切换?
角色撞到东西之后应该发生什么?
以前玩游戏的时候不会想这些问题,但开始做游戏之后,我逐渐开始用另外一种方式观察游戏。
接下来,是想办法“折磨玩家”
角色能够跑和跳之后,单纯让玩家从 A 点走到 B 点显然没什么意思。
于是关卡里开始出现各种机关。
旋转的平台。
不断运动的障碍。
摆动的巨大吊球。
横跨峡谷的滚木。

一开始,我只是按照教程把一个机关做出来。
但真正让我开始理解 Blueprint 的,是后面不断出现的类似需求。
如果每一个旋转机关都重新写一遍逻辑,会变得非常麻烦。
如果下一个机关只是尺寸不同、旋转速度不同、方向不同呢?
这时候我第一次比较明确地接触到了一个后来一直影响我做游戏的概念:
不要只是把功能“做出来”,还要考虑它能不能被重复使用。
于是原本“这个东西会旋转”,慢慢变成了:
能不能做成一个可以反复放进关卡里的机关?
通过暴露参数,可以改变速度、方向和表现;之后再制作类似机关的时候,就不需要重新从头搭一套逻辑。

现在来看,这只是非常基础的蓝图复用。
但当时,这是我第一次真正体会到:这不是和我平时做的后端很像嘛
第一次处理死亡
有了机关之后,自然就会有另外一个问题:
玩家掉下去怎么办?
一开始我对“死亡”的理解其实很简单。
血量没了,角色消失,然后重新开始。
但真正实现之后才发现,即便这么简单的死亡流程,也会涉及很多东西。
什么时候判定玩家死亡?
死亡之后还能不能继续输入?
角色应该直接消失,还是先播放某种效果?
死亡之后从哪里重新出现?
最终,我给角色加入了死亡后的布娃娃效果。
角色撞上机关或者掉下去之后,不再只是突然消失,而是失去控制,身体随着物理效果倒下。
那一刻其实挺有意思。
因为从视觉上看,游戏突然就比之前“像个游戏”了很多。
然后我发现:总不能每次都从头开始吧
随着关卡越来越长,一个很自然的问题出现了。
如果玩家已经通过了前面大量机关,却因为最后一个障碍失误,然后直接回到游戏最开始……
至少我自己玩的时候会非常痛苦。
所以后面又加入了检查点。
玩家通过某些位置之后,游戏会记录新的出生位置。
死亡后不再统一返回起点,而是从最近经过的检查点重新开始。
这也是我第一次比较完整地把:
触发 → 状态记录 → 死亡 → 重生 → 恢复游戏
这一整条 Gameplay 流程串起来。
到这里,这个项目才开始真正具有一个闯关游戏应该有的循环:
进入关卡 ↓观察机关 ↓移动 / 跳跃 ↓通过机关 ↓触发检查点 ↓继续挑战 ↓失败 ↓死亡 ↓最近检查点重生 ↓重新挑战以前看到“Gameplay Loop”这种词时,我其实没有特别具体的感觉。
做到这里之后才发现:
所谓 Gameplay Loop,并不一定是什么特别高深的架构。
它首先意味着玩家做的事情能够真正形成一个完整的循环。
关卡也开始越来越不像测试场景
随着机关逐渐增加,我开始把它们真正摆进一个完整场景里。
旋转平台铺在峡谷之间。
吊球悬挂在桥梁上方。
巨大的圆木横跨地形。
不同区域之间用桥、悬崖和高低差连接。

后来回头看整个关卡的时候,其实能够很明显地看到一种很刻意的痕迹:
很多地方都是为了展示某一种机关而存在。
但这也是我第一次开始思考另外一个问题:
机关做出来以后,应该怎么放进关卡?
一个机关本身能工作,并不代表它放进地图之后就一定好玩。
两个机关距离多远?
玩家能不能提前看见危险?
失败之后重新挑战需要多久?
机关之间有没有节奏变化?
虽然当时远远谈不上真正意义上的专业关卡设计,但至少从这个项目开始,我不再只是想着“这里能不能放一个东西”,而开始考虑玩家是怎么经过这里的。
最后,我给终点放了一场烟花
整个关卡最后,我做了一个非常简单的终点庆祝效果。
玩家终于通过所有机关之后,周围会出现庆祝表现和烟花。

从纯技术角度来说,这可能是整个项目里最不重要的一部分。
但实际做出来的时候,我反而很喜欢这里。
因为之前的所有内容——角色移动、跳跃、机关、死亡、重生、检查点——终于有了一个明确的终点。
第一次从起点完整跑到这里,看着终点效果触发的时候,我第一次有了一种比较明确的:
“这个东西做完了。”
的感觉。
现在再来看这个项目
现在的我再打开这个项目,会看到很多非常稚嫩的地方。
蓝图结构可以做得更好。
关卡设计也远远谈不上成熟。
很多功能本质上也没有太多很复杂的地方
如果按照我现在做项目的标准来看,它无论是系统复杂度、代码结构还是可扩展性,都没有什么特别值得炫耀的地方。
但我并不觉得这是一个应该被从经历里删掉的项目。
因为它记录的是另外一件事情:
我第一次完整走过了一遍游戏开发最基础的流程。
从一个空场景开始。
让角色能够移动。
加入跳跃。
加入机关。
让机关能够复用。
加入死亡。
加入布娃娃。
加入重生。
加入检查点。
继续制作新的机关。
搭建完整关卡。
最后制作终点。
每一个功能单独拿出来都非常简单。
但游戏本来就是这样一点一点搭出来的。
它之后发生了什么
做完这个项目之后,我并没有继续沿着“做更多机关”的方向走下去。
相比单纯制作一个能够玩的关卡,我开始越来越在意游戏背后的系统是怎么组织起来的。
角色系统应该怎么设计?
武器为什么要这样管理?
多人游戏里到底谁说了算?
一个技能从按下按键到造成伤害,中间到底经历了什么?
游戏系统怎样才能在不断增加内容之后依然保持可维护?
于是后来,我开始继续学习 C++,继续研究 Unreal Engine,也开始接触 Lyra、GAS、多人网络以及更复杂的 Gameplay 架构。
现在正在做的项目已经和这个小小的第三人称闯关 Demo 完全不是一个复杂度了。
但如果一定要给自己的 UE 学习找一个真正的起点,我想可能就是这里。
不是因为这个项目有多厉害。
而是因为在这里,我第一次从:
“我会操作 Unreal Engine。”
走到了:
“我好像真的可以用 Unreal Engine 做一个游戏。”