一个球形星球上的送信员,5个配送任务,cel-shaded 低多边形画风——这是 Messenger,一款最近在全网爆火的免费浏览器游戏。而我用 GLM 5.2 + OpenCode,花了5小时、411.68元,完成了它的 MVP 复刻。
Messenger(by Abeto)是一款在小小球形星球上扮演送信员的休闲浏览器游戏。你往任何方向走,最终都会回到原点,就像界王星一样。画风是治愈的 cel-shaded 卡通风格,配 lo-fi 音乐,没有教程、没有指引,就是自由探索和对话。
它在 Awwwards 上获奖,被 Polygon、The Verge、Dexerto 等媒体报道,Yoko Taro(尼尔:自动人形制作人)都赞不绝口。
我选它来测试 GLM 5.2,是因为它技术含量不低:球面重力、动态相机、竖直方向系统、cel-shading,每一个都是 Three.js 的技术难点。如果能复刻这个,就说明模型的能力到了什么水平。好在 GLM 5.2 没有让我失望,复现了 Messager 的 MVP 版本。
整个流程是这样的:我先用浏览器实际体验了原版游戏(用 Playwright 自动化 + GLM 4.6V 视觉模型截图分析),摸清了操作手感、任务流程、UI 布局。然后 Prometheus(规划 agent)生成了一份 16 任务 + 4 终审的工作计划,经 Oracle 三道门禁验证后,Atlas(编排 agent)按 4 个并行 wave 分发任务给子 agent 执行。
Prometheus 分析了我用 Playwright 提取的游戏数据(120个资源请求、JS bundle 里的对话/NPC/任务数据、DOM 结构),结合 web 评测,生成了一份结构化的工作计划。Metis(预规划顾问)还自带 3 个研究子 agent 验证了关键技术点:
rotateOnAxis,禁止绝对 setFromUnitVectors 重建。因为这会导致南极锁死(Hairy Ball 定理)IcosahedronGeometry 而非 SphereGeometry(避免极点纹理挤压)MeshToonMaterial + OutlineEffect,~20 行代码,无需自定义着色器16 个任务按 4 个 wave 并行执行:
| Wave | 任务 | 产出 |
|---|---|---|
| 1 | 脚手架/类型/材质/音频 | 项目骨架 + 数据模型 + cel 材质 + Howler 音频 |
| 2 | 球面世界/角色/调试API/对话UI | IcosahedronGeometry 星球 + 重力 + 低多边形人形 + window.__game |
| 3 | 玩家控制器/NPC/任务/世界/相机 | 球面移动 + 5NPC + 任务状态机 + 3区域 + 第三人称相机 |
| 4 | 交互/标题屏/HUD | E键对话 + 标题屏 + 开场过场 + HUD |
每个任务都由子 agent 独立完成,Atlas 逐个验证(读代码 + tsc + build + Playwright 运行时 + GLM 4.6V 视觉截图)。
16 个模块都完成后,发现一个计划缺口:没有任何任务负责把模块串联进 main.ts(每个任务都被要求"不修改 main.ts")。补了一个集成任务,把所有模块接上,游戏真正跑起来了。
终审 4 个 agent 并行:计划合规(Oracle)、代码质量、手动 QA(Playwright 全流程)、范围保真——全部通过。
上线后我发现了几个 bug,并让 GLM 5.2 逐个修复:
AudioManager.playBgm() 从未被调用——实现正确但没接上线。修好后又发现 BGM 是 ffmpeg 合成的 220Hz 蜂鸣声,换成 CC0 lo-fi 真实音乐球面重力是最高风险点。在球面上行走,玩家始终"站"在球面上,跳跃是径向的。如果用 setFromUnitVectors(up, normal) 每帧重建朝向,在南极会因为法线突变导致锁死(Hairy Ball 定理——球面上不存在处处非零的切向量场)。解法是用增量 rotateOnAxis:每帧绕局部轴旋转一个小角度,朝向自然演化,永远不会锁死。这个点 Metis 的研究子 agent 从 Three.js 论坛 #58349 找到了验证。
getWorldDirection 返回 +Z 不是 -Z。three@0.161 的 getWorldDirection() 返回 set(e[8], e[9], e[10])(无取反),即局部 +Z 轴。这和旧版文档说的 -Z 相反。我的玩家控制器一开始基于 -Z 假设写的前进方向,W 键倒着走。查了源码确认后修正。
cel-shading 意外地简单。MeshToonMaterial + 3 色 gradientMap(NearestFilter)+ OutlineEffect,总共 ~20 行,全是 Three.js 内置 API。不需要自定义 ShaderMaterial,不需要后处理管线。唯一陷阱:flatShading 必须在构造后赋值(构造参数里传会被静默丢弃)。
CC0 资源生态。角色模型用了 Quaternius 的 Animated Human(CC0,含 idle/walk/run/jump 骨骼动画),BGM 用了 btahir/open-lofi 的 "Drifting Through Fog"(CC0,185秒 lo-fi)。全程无版权风险。
| 项目 | 数据 |
|---|---|
| 总 token 花费 | 411.68 元 |
| 耗时 | ~5 小时 |
| 代码量 | 21 个 TS 模块,~2500 行 |
| Git 提交 | ~30 个原子提交 |
| 模型 | GLM 5.2(所有编程 agent 背后的模型)+ GLM 4.6V(视觉QA) |
411 元,做出一个真正可玩的 3D 浏览器游戏——有标题屏、开场过场、球形世界、5个配送任务、5个NPC、cel-shaded 画风、骨骼动画、lo-fi 背景音乐。这是一个你能打开就玩、操作流畅、没有明显 bug 的游戏。
这次实验让我对 AI 一人创作者的能力边界有了新的认识:
GLM 5.2 的工程能力够硬。球面重力、相机极点安全、AnimationMixer 骨骼动画——这些不是套模板,是需要真正理解 Three.js 数学才能做对的。模型做到了,而且是在编排系统的指导下自主完成的。
成本已经低到可以"随便试"。411 元、5小时——这比一个外包设计师一天的工资还低。以前做一个 3D 游戏 MVP 至少要几周、几万块。现在一个下午、一顿请客的饭钱就够了。
迭代速度是关键优势。测试时发现的:"移动太快"、"S键倒着走"、"方向反了"的问题从反馈到修复上线不超过10分钟。这种迭代速度是传统开发不可能实现的。
规划比编码更重要。这次最值的不是编码,而是前期的规划(Prometheus + Metis + Oracle 三轮验证)。规划做对了,16个任务并行执行几乎一次过;规划做漏了,就得不停返工。
操作:WASD/方向键移动,Space 跳跃,Shift 冲刺,E 或点击 NPC 对话,Esc 暂停。
Vibe Friends 是专注于 AI 一人创作者的社群。我们坚信 AI 能够极大地赋能那些拥有想法、创意、审美以及执行力的个体。Vibe 代表着一种可以自由创作、并从中获得回报的生活方式。
如果你也在用 AI 做创作,欢迎加入我们:
同时推荐试试 Vibe Usage——一个查看 Vibe Coding token 消耗的工具,帮你像这次一样,精确知道每个项目花了多少钱。
另外,这篇文章也是由 GLM 5.2 + OpenCode 协作完成。游戏开发全程使用 GLM 5.2 作为主力模型,GLM 4.6V 用于视觉 QA。
登录后评论