THE JOURNAL / FIELD NOTES
用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示)

转载并翻译自 builtbysketch 的原文,版权归原作者所有。

我用 GPT 5.6 Astra 做出了一款完整游戏,结果在 X 上还挺火的。
一开始它还只是个演示,但 4 天后,我们有了完整可玩的版本,不再只是那种跑一遍就完事的烂演示。〔译注:原文此处写作“the full playable Okay”,措辞不明;这里按上下文理解为“完整可玩的版本”。〕
去 paperroute.lol 看看 PaperRoute 吧。

这是一款 Paperboy 风格的送报游戏,背景设在一个美国社区。整个游戏分几次做完,GPT 5.6 Astra 负责写代码,Blender 负责做模型。
问题是,一次生成的演示确实很惊艳,但做出一款完整游戏完全是另一回事。要让它有风格、看着出彩,也不是给一次提示词就够了。
这就是我的操作手册,用来做出一款经过打磨(四天里能打磨到什么程度就打磨到什么程度)、能玩、好看,而且不止会一招的游戏。其实连 4 天都不到,视频在 X 上火了之后,剩下的时间基本都花在调整网站、把它准备好让你们来玩上了。
每一个小时、每一个 token 都有记录,所以我能告诉你实际花了多少,而不是凭感觉说。这是整套做法,按实际发生的顺序来。我还写了一份完整的开发日志,记下了每一步。
在这里阅读完整开发日志
每一轮对话、每一屏画面、每一项统计
背景
早在 7 月,我就想让 Fable 试着做一款 Paperboy。不过要来个现代版,所以我写了一份需求说明。
从周一到周日,送整整一周的报纸,有订户和非订户、狗、汽车,还有斜向镜头。我还想把它做成原生 iOS 版本,也要有网页版。不过只做出了一条灰盒街道和一个骑手,7 月就卡住了。这个后面再说。)
进展不太顺利,我就放弃了。
Fable 使出浑身解数,也就弄出一辆侧着的自行车。

AGI?拉倒吧兄弟,没戏(至少现在还没戏)。
好吧,也没那么糟。Fable 还是挺厉害的,我也确实做出了一些东西,只是没做到我想要的程度。
第 1 步:从一份你自己就认同的需求说明开始
这个点子不是 Astra 想出来的。
Astra 发布时,我看了 OpenAI 的演示,觉得它可能正合适。
所以我重写了原来的需求说明,没有直接复用。
说实话,提示词特别简单。
我用直白的英语描述了原版游戏、其中一些玩法机制,然后告诉它我想让它做什么。
这时我们只关注玩法机制,并给了它一张视角参考图。就是原版 Paperboy 的视角。
我的想法从来都不是照搬原版 Paperboy,而是拿这个概念玩出点新花样。不过,既然要给模型一个起点,那就给它最好的。对于一款骑自行车送报的游戏来说,最好的基础就是原版。
先把玩法机制做好,能玩了以后再玩出自己的花样。

第 2 步:调整游戏方向
这时我把两件事分开了。
我给了 Astra 两项独立的任务。
- 美术方向
- 游戏方向
都放在同一个对话线程里。
头一轮“一次生成”后,Astra 给了我一个能拿来演示的东西。它给出的等距视角和游戏风格,我打算保留;我只打算调整游戏方向和玩法机制,改动镜头,以及它看起来、玩起来的感觉。要知道,它最初给我的那个演示,基本就是你在 Twitter 上常见的那类东西。

一次生成,看着不错,挺有意思,有一套很有自己主张的美术风格,图形界面也基本就是你在其他所有演示里见过的那一套。
那时我只关心概念和玩法机制,塞进一大堆美术方向要求只会分散注意力。
这个决定在第一天晚上就值回来了。
Astra 在午夜前用六次提交做出了浏览器版本:有确定性模拟,瞄准后沿抛物线飞行的报纸会落在虚线弧线标示的位置,有投进信箱的计分,还有一条以公园赛道收尾的路线。它一边写一边补测试,这比我预想的更有用,因为此后的每一次美术改动,都有一套测试可以跑。
该好好调整了。

第 3 步:调整美术方向
第一版的视角和游戏手感达到我想要的样子之后,我就能开始调整美术方向,同时继续用提示词改进玩法机制、扔报纸之类的东西。
我用 GPT 生成了一堆图片。
其实这时候,趁游戏还在编译,我暂时离开了 Astra,转去用 ChatGPT,给它几张参考图,让它做一些概念图和一块情绪板。
也不是“Ghibli”风格。我一次都没用过这个词。
我给它的,是一段描述性的参考:带着日本夏日凉风感觉的电影,加上手绘纹理效果。
然后 GPT 给我做出了一块风格参考情绪板,我再把它喂给模型,作为后续调整的基础。

我还不想一股脑把“游戏到底该长什么样”的细节全塞给模型或塞进提示词里。
把几条工作线放在同一个对话线程里推进
我平时不这么干,通常会另开分支。不过,用上新工作流和我自己定制过的 T3 code form 之后,我觉得这正好是个全程留在一个对话线程里的机会。而且 Astra 似乎比 Fablecap 更能应付这种做法:你可以打断它,它好像也不会掉链子,这太棒了。
我一条提示词接一条提示词地迭代,美术方向和游戏两边都在改。看着它把我的 MacBook 烧得够呛,Blender 则悄无声息地在后台跑着,时不时给我送来挺惊艳的渲染图和测试结果。这期间,演示始终在那个网址上运行,基本全程都能玩。
负责游戏引擎的那条工作线,我是一边实时玩一边调整的。那部分很枯燥、很重复,但如果再来一次,我还是会原样照做。
松手就停止转向。撞车后有一段恢复时间,免得同一个垃圾桶连吃你三条命。狗真的会追你,你可以骑快点甩掉它,也可以扔份报纸转移它的注意力。手机操作是拖动转向、长按蹬车、轻点投掷。这些改动,每一项都是一条提示词、去浏览器里看一遍结果、一次提交。
通过 Python 运行 Blender。
风格这条线用的是 Blender。Astra 不会打开 Blender,而是编写 Python,让 Blender 在无界面模式下运行,不是通过 mcp。
游戏里的每一栋房子、每一棵树、每一段围栏和每一个信箱,都是一个脚本:构建网格、拆分材质、导出 GLB。第一轮先单独做了一次夏日美术习作,把房屋轮廓、树木造型和街头道具各自渲染出来,放在一页上,然后才把它们放进能玩的游戏世界。
接着放进了成套的房屋,再加上更茂密的花园,然后是带绘画感的表面。到第二天早上十点,已经有七组房屋了。

如果要让别人照着学一件事,我会说,把这两条工作线分开。房子看着不对时,你可不想还在同一个对话线程里跟模型掰扯投掷物理。
第 4 步:定制模型
遇到棘手的活儿,就用 Meshy。

说实话,Astra 做房屋和一些挺简单的东西,的确不错。但是,要让它们好看,就得在每一栋房子上花很多心思,一遍遍给提示词。

我的主角骑手看着像个木偶。老实说,Astra 也做不出好多少的东西,更别说做出一张脸了。

所以,最好的办法要么是去下载一些免费的 Blender 素材,要么,如果你像我一样,脑子里有个具体的角色,那就用 Meshy,先在 ChatGPT 里生成图片。
把图发给 Meshy,花 $8。我基本上拿到了 300 次图片生成额度,现在还远远没用完。
你真可以直接把图片上传到 Meshy,它就会把图片变成可下载的 3D 模型。把模型丢给 Astra,让它减少多边形。啪,你的游戏里就有了一个看起来不像一坨屎的定制 3D 模型。之前跟 Astra 反复迭代,烧掉了一大堆 token,却一点进展都没有。
用上这套 Meshy 工作流之前,那个模型简直烂透了。
把这个模型硬拼到我做的另一辆自行车上,还是有点难,来回折腾了几轮,不过最后还是弄成了,而且确实做出了一个过得去的结果。不完美,但过得去。真要继续调整,我大概还能在这儿烧掉一大堆提示词。

小窍门:只要骨骼绑定做得好,发挥空间就没有上限。〔译注:原文写作“SKUs the limit”,疑为“the sky’s the limit”的误写或双关。〕
第 5 步:添加细节
一次生成的游戏缺少细节。
一次生成的游戏缺少用心。
当然,它们可能天生就带着新鲜感,但定制动画、更好的 UI,会让游戏感觉像个真家伙。
这倒不是在说,我们正在见证的这一切无可否认。现在能做出来的东西,简直离谱。
不过,眼下审美还是护城河(还有耐心)。
我实际投入的会话时间,以及和智能体来回对话的轮次,有 80-% 都花在打磨、修复糟糕的网格,以及用提示词要求它补细节上。不是在做游戏。
对 PaperRoute 来说,这些精雕细琢最后确实很有分量。
Astra 写了 Blender 脚本,在保留原来的脸、发束和帽子缝线的同时,把身体的多边形数降到游戏的面数预算内;重做袖子和手臂,避免皮肤从衣服里穿出来;把短裤裤脚和腿分开;把整个模型适配到现有的自行车上,让手能正确握住车把,脚能正确踩住踏板;再用 23 根骨骼做绑定,其中三根给头发,三根给衣摆,让它们随速度动起来。

我有大概 30 次提交,回头读起来,活像一本该死的裁缝记事本。
修复骑手服装的几何结构,重建骑手的手臂和袖子,保留短裤裤脚,给自行车换上更直的 BMX 车把。
然后,同样的循环又用在了那个拿着报纸从屋里出来的暴躁男人,以及那个拿着玩具遥控器的男孩身上。
在 ChatGPT 里做概念图,用 Meshy 出网格,通过 Astra 写脚本在 Blender 里处理,绑骨骼,看渲染图,再放进游戏。有了这套流程,第二个角色的成本就只需要第一个的一小部分。
窍门:建立循环审查流程
看渲染图做审查,才是真正的工作。
做到中途,我才明白这一点。
前期我就通过提示词搭了一套辅助机制,让它持续循环、检查自己的工作。我会让它自己看模型哪里不对,把那个模型单独渲染出来,再发回来给我审,然后我再给提示词。从渲染图 1 到渲染图 2,所有改进里有 60-70% 都是智能体靠这套做法完成的。
审查模型做出来的 3D 作品,靠的就是看渲染图。
Astra 搭了截图脚本,让实际的 Three.js 骑手摆出转向、投掷、冲刺和摔倒的姿势,每次都保存正面、侧面、背面,以及白模的各角度视图。
开发日志里的每一个检查点,旁边都有这些渲染图。哪里不对,你就指着那张图说,帽子没盖住头发,这就是提示词。

第 6 步:融入审美,添上点睛之笔
上面说的全是流程。流程能让你做出一款能玩的游戏,却不能让人想玩第二次。中间的差距就是审美,这部分得你自己带进来。
你没法靠一次生成,就得到一款好看又完整的游戏。最后只会弄出一堆垃圾。
这里有些审美上的决定,就是把东西扔掉。
原来的模型,基本全都扔了,换成完全定制的角色。(或者说,会被换掉。)
看看那个老头和那个拿遥控器的小孩,就能看出游戏美术是怎么落到角色身上的。如果还要多花些时间,我会花在这里:更多角色,让现有角色再鲜活一点,这样街道才会有动感,也有点个性。

然后,就是那些点睛之笔。
砸碎窗户的效果单独开了一整个分支。雨天也是。同样,仍然在一条工作线里,但开了两个独立的子智能体对话线程。新的工作树,新的游戏版本,各自单独测试,准备合并进来。

我甚至花了不少时间调整摔倒动作。

骑手摔倒动作预览
窍门:做实验、开游戏分支,先测试功能想法,再把它们合进来。
我想要砸碎窗户这个效果,但不确定能不能成,所以就在独立分支里试了。
只做砸窗户,用一个完全独立的镜头,拉近窗户,在撞击时停留,再转回骑手身上。第一轮之后,我把终点的滑板公园拉长,让它更像个训练场,让路线以一段好玩的内容收尾,而不是就这么停下来。
后来我又做了更大的豪宅,沿街摆进去,让街道更有变化。最重要的是,我做了一套全新的天气系统。先做小东西,比如驶出水坑时溅起的水花和留下的轮胎印,然后做出一整天都在下雨的日子。
这些东西能让游戏活起来,增加层次。
这款游戏本来很容易就会变成一条平路,反复玩同样的一趟,直到刷到最高分。把这些东西混搭起来,就多了一个维度,而审美真正重要的地方就在这里。
网站也是一样。没能让我立刻上线的,就是要把网站做得像那么回事,把整个概念都包进去。落地页是一份报纸,成绩页是一份报纸,排行榜也是一份报纸。我觉得这方面自己做得还行。
花了多少
DevClocked 把一切都记了下来。从 7 月 1 日第一次规划提交,到 9 月 12 日,也就是部署上线四天后:
记录覆盖了 39 小时,其中 25.2 小时计为人在场,13.8 小时为智能体单独运行
15.6 亿个 token,其中 15.3 亿个是缓存读取
API 用量折合 $2,175,这不是我的账单
跨 11 天,共 90 次提交

在场情况是从 9 月 6 日才开始追踪的。在那之前,记录的时间默认都算我在场。在那之后,记录下来的时间里有三分之二,我都不在键盘前。

八次提交,然后空了两个月。9 月重做浏览器版,开发用了四天,第五天上线,大家现在玩的就是这个游戏。7 月那段时间,我也不算完全后悔,因为需求说明和模拟设计都留了下来。但如果一开始就从浏览器做起,我第一天就能有个能玩的东西。
还有些没解决的问题,我宁愿说出来,也不想装作没有。手机上能不能持续保持 60fps,还没得到验证。一次受控测试稳住了,另一次平均是 58。Meshy 做的骑手有 88,550 个三角面,因为我保留了那张脸,而且我还没在真实手机上对它做过性能测试。
太长不看版:如果你也想做,顺序如下
先用自己的话写需求说明,再挑一份最接近你想要效果的参考,哪怕那就是你不能照搬的东西。
把需求说明和两三张粗略的图片交给模型,先别给美术方向,等玩法机制能玩了再说。
引擎和外观分开对话推进。
用 Python 在 Blender 里做道具,这样每个素材都能重新生成。
角色需要脸的时候,先在 ChatGPT 里做概念图,用 Meshy 出网格,再交给 Astra 做减面、绑骨骼和适配。
每改一次,都要有供审查的渲染图。留一天给那些点睛之笔,天气、砸窗户、终点的公园,因为这些才会让人觉得值得再玩一次。
记录你的工时和 token 用量,因为你会想知道的。
然后给它挂上一个域名。
我这款就在 paperroute.lol,那里的开发日志记着它背后的每一个检查点、每一张渲染图、每一个小时。