跳到正文

THE JOURNAL / FIELD NOTES

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

How to build a full game with Blender and GPT 5.6 Astra (not just a demo)
x.com

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

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 47468b45-f977-4981-b6a5-8d1c96bda038

我用 GPT 5.6 Astra 做出了一款完整游戏,结果在 X 上还挺火的。

一开始它还只是个演示,但 4 天后,我们有了完整可玩的版本,不再只是那种跑一遍就完事的烂演示。〔译注:原文此处写作“the full playable Okay”,措辞不明;这里按上下文理解为“完整可玩的版本”。〕

去 paperroute.lol 看看 PaperRoute 吧。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 1f02bd72-5fe5-4685-b4b4-8d45b61dd8c2

这是一款 Paperboy 风格的送报游戏,背景设在一个美国社区。整个游戏分几次做完,GPT 5.6 Astra 负责写代码,Blender 负责做模型。

问题是,一次生成的演示确实很惊艳,但做出一款完整游戏完全是另一回事。要让它有风格、看着出彩,也不是给一次提示词就够了。

这就是我的操作手册,用来做出一款经过打磨(四天里能打磨到什么程度就打磨到什么程度)、能玩、好看,而且不止会一招的游戏。其实连 4 天都不到,视频在 X 上火了之后,剩下的时间基本都花在调整网站、把它准备好让你们来玩上了。

每一个小时、每一个 token 都有记录,所以我能告诉你实际花了多少,而不是凭感觉说。这是整套做法,按实际发生的顺序来。我还写了一份完整的开发日志,记下了每一步。

在这里阅读完整开发日志
每一轮对话、每一屏画面、每一项统计

背景

早在 7 月,我就想让 Fable 试着做一款 Paperboy。不过要来个现代版,所以我写了一份需求说明。

从周一到周日,送整整一周的报纸,有订户和非订户、狗、汽车,还有斜向镜头。我还想把它做成原生 iOS 版本,也要有网页版。不过只做出了一条灰盒街道和一个骑手,7 月就卡住了。这个后面再说。)

进展不太顺利,我就放弃了。

Fable 使出浑身解数,也就弄出一辆侧着的自行车。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 4d10c93e-3727-4c31-a6af-84e050b39cf0

AGI?拉倒吧兄弟,没戏(至少现在还没戏)。

好吧,也没那么糟。Fable 还是挺厉害的,我也确实做出了一些东西,只是没做到我想要的程度。

第 1 步:从一份你自己就认同的需求说明开始

这个点子不是 Astra 想出来的。

Astra 发布时,我看了 OpenAI 的演示,觉得它可能正合适。

所以我重写了原来的需求说明,没有直接复用。

说实话,提示词特别简单。

我用直白的英语描述了原版游戏、其中一些玩法机制,然后告诉它我想让它做什么。

这时我们只关注玩法机制,并给了它一张视角参考图。就是原版 Paperboy 的视角。

我的想法从来都不是照搬原版 Paperboy,而是拿这个概念玩出点新花样。不过,既然要给模型一个起点,那就给它最好的。对于一款骑自行车送报的游戏来说,最好的基础就是原版。

先把玩法机制做好,能玩了以后再玩出自己的花样。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 45746a5c-eb1a-4466-bfd1-038f463a11db

第 2 步:调整游戏方向

这时我把两件事分开了。

我给了 Astra 两项独立的任务。

  • 美术方向
  • 游戏方向

都放在同一个对话线程里。

头一轮“一次生成”后,Astra 给了我一个能拿来演示的东西。它给出的等距视角和游戏风格,我打算保留;我只打算调整游戏方向和玩法机制,改动镜头,以及它看起来、玩起来的感觉。要知道,它最初给我的那个演示,基本就是你在 Twitter 上常见的那类东西。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 381862a2-3052-4a53-b0d2-1b429ece811d

一次生成,看着不错,挺有意思,有一套很有自己主张的美术风格,图形界面也基本就是你在其他所有演示里见过的那一套。

那时我只关心概念和玩法机制,塞进一大堆美术方向要求只会分散注意力。

这个决定在第一天晚上就值回来了。

Astra 在午夜前用六次提交做出了浏览器版本:有确定性模拟,瞄准后沿抛物线飞行的报纸会落在虚线弧线标示的位置,有投进信箱的计分,还有一条以公园赛道收尾的路线。它一边写一边补测试,这比我预想的更有用,因为此后的每一次美术改动,都有一套测试可以跑。

该好好调整了。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - b713cc97-a544-4658-af70-73841cbd15fc

第 3 步:调整美术方向

第一版的视角和游戏手感达到我想要的样子之后,我就能开始调整美术方向,同时继续用提示词改进玩法机制、扔报纸之类的东西。

我用 GPT 生成了一堆图片。

其实这时候,趁游戏还在编译,我暂时离开了 Astra,转去用 ChatGPT,给它几张参考图,让它做一些概念图和一块情绪板。

也不是“Ghibli”风格。我一次都没用过这个词。

我给它的,是一段描述性的参考:带着日本夏日凉风感觉的电影,加上手绘纹理效果。

然后 GPT 给我做出了一块风格参考情绪板,我再把它喂给模型,作为后续调整的基础。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 201fe2d3-64d5-4b1e-a4bd-db06349f2fe9

我还不想一股脑把“游戏到底该长什么样”的细节全塞给模型或塞进提示词里。

把几条工作线放在同一个对话线程里推进

我平时不这么干,通常会另开分支。不过,用上新工作流和我自己定制过的 T3 code form 之后,我觉得这正好是个全程留在一个对话线程里的机会。而且 Astra 似乎比 Fablecap 更能应付这种做法:你可以打断它,它好像也不会掉链子,这太棒了。

我一条提示词接一条提示词地迭代,美术方向和游戏两边都在改。看着它把我的 MacBook 烧得够呛,Blender 则悄无声息地在后台跑着,时不时给我送来挺惊艳的渲染图和测试结果。这期间,演示始终在那个网址上运行,基本全程都能玩。

负责游戏引擎的那条工作线,我是一边实时玩一边调整的。那部分很枯燥、很重复,但如果再来一次,我还是会原样照做。

松手就停止转向。撞车后有一段恢复时间,免得同一个垃圾桶连吃你三条命。狗真的会追你,你可以骑快点甩掉它,也可以扔份报纸转移它的注意力。手机操作是拖动转向、长按蹬车、轻点投掷。这些改动,每一项都是一条提示词、去浏览器里看一遍结果、一次提交。

通过 Python 运行 Blender。

风格这条线用的是 Blender。Astra 不会打开 Blender,而是编写 Python,让 Blender 在无界面模式下运行,不是通过 mcp。

游戏里的每一栋房子、每一棵树、每一段围栏和每一个信箱,都是一个脚本:构建网格、拆分材质、导出 GLB。第一轮先单独做了一次夏日美术习作,把房屋轮廓、树木造型和街头道具各自渲染出来,放在一页上,然后才把它们放进能玩的游戏世界。

接着放进了成套的房屋,再加上更茂密的花园,然后是带绘画感的表面。到第二天早上十点,已经有七组房屋了。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 422d2ed7-7615-4077-86e8-b87c0f2dc347

如果要让别人照着学一件事,我会说,把这两条工作线分开。房子看着不对时,你可不想还在同一个对话线程里跟模型掰扯投掷物理。

第 4 步:定制模型

遇到棘手的活儿,就用 Meshy。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - b8a5feb8-d5f8-4c3b-8f82-6e7c9792b8ea

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

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 8f5dc293-4a91-4376-a3b3-8edc41e4f571

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

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - d8da6c3b-8007-4142-8375-9825667cd456

所以,最好的办法要么是去下载一些免费的 Blender 素材,要么,如果你像我一样,脑子里有个具体的角色,那就用 Meshy,先在 ChatGPT 里生成图片。

把图发给 Meshy,花 $8。我基本上拿到了 300 次图片生成额度,现在还远远没用完。

你真可以直接把图片上传到 Meshy,它就会把图片变成可下载的 3D 模型。把模型丢给 Astra,让它减少多边形。啪,你的游戏里就有了一个看起来不像一坨屎的定制 3D 模型。之前跟 Astra 反复迭代,烧掉了一大堆 token,却一点进展都没有。

用上这套 Meshy 工作流之前,那个模型简直烂透了。

把这个模型硬拼到我做的另一辆自行车上,还是有点难,来回折腾了几轮,不过最后还是弄成了,而且确实做出了一个过得去的结果。不完美,但过得去。真要继续调整,我大概还能在这儿烧掉一大堆提示词。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 613060b1-8751-4d63-8646-45b92ad11667

小窍门:只要骨骼绑定做得好,发挥空间就没有上限。〔译注:原文写作“SKUs the limit”,疑为“the sky’s the limit”的误写或双关。〕

第 5 步:添加细节

一次生成的游戏缺少细节。
一次生成的游戏缺少用心。

当然,它们可能天生就带着新鲜感,但定制动画、更好的 UI,会让游戏感觉像个真家伙。

这倒不是在说,我们正在见证的这一切无可否认。现在能做出来的东西,简直离谱。

不过,眼下审美还是护城河(还有耐心)。

我实际投入的会话时间,以及和智能体来回对话的轮次,有 80-% 都花在打磨、修复糟糕的网格,以及用提示词要求它补细节上。不是在做游戏。

对 PaperRoute 来说,这些精雕细琢最后确实很有分量。

Astra 写了 Blender 脚本,在保留原来的脸、发束和帽子缝线的同时,把身体的多边形数降到游戏的面数预算内;重做袖子和手臂,避免皮肤从衣服里穿出来;把短裤裤脚和腿分开;把整个模型适配到现有的自行车上,让手能正确握住车把,脚能正确踩住踏板;再用 23 根骨骼做绑定,其中三根给头发,三根给衣摆,让它们随速度动起来。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 2ba3c53a-0e66-4071-96bf-9e1c0d971c5a

我有大概 30 次提交,回头读起来,活像一本该死的裁缝记事本。

修复骑手服装的几何结构,重建骑手的手臂和袖子,保留短裤裤脚,给自行车换上更直的 BMX 车把。

然后,同样的循环又用在了那个拿着报纸从屋里出来的暴躁男人,以及那个拿着玩具遥控器的男孩身上。

在 ChatGPT 里做概念图,用 Meshy 出网格,通过 Astra 写脚本在 Blender 里处理,绑骨骼,看渲染图,再放进游戏。有了这套流程,第二个角色的成本就只需要第一个的一小部分。

窍门:建立循环审查流程

看渲染图做审查,才是真正的工作。

做到中途,我才明白这一点。

前期我就通过提示词搭了一套辅助机制,让它持续循环、检查自己的工作。我会让它自己看模型哪里不对,把那个模型单独渲染出来,再发回来给我审,然后我再给提示词。从渲染图 1 到渲染图 2,所有改进里有 60-70% 都是智能体靠这套做法完成的。

审查模型做出来的 3D 作品,靠的就是看渲染图。

Astra 搭了截图脚本,让实际的 Three.js 骑手摆出转向、投掷、冲刺和摔倒的姿势,每次都保存正面、侧面、背面,以及白模的各角度视图。

开发日志里的每一个检查点,旁边都有这些渲染图。哪里不对,你就指着那张图说,帽子没盖住头发,这就是提示词。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - b0052c88-bda1-41b0-b886-bbe08fa9839d

第 6 步:融入审美,添上点睛之笔

上面说的全是流程。流程能让你做出一款能玩的游戏,却不能让人想玩第二次。中间的差距就是审美,这部分得你自己带进来。

你没法靠一次生成,就得到一款好看又完整的游戏。最后只会弄出一堆垃圾。

这里有些审美上的决定,就是把东西扔掉。

原来的模型,基本全都扔了,换成完全定制的角色。(或者说,会被换掉。)

看看那个老头和那个拿遥控器的小孩,就能看出游戏美术是怎么落到角色身上的。如果还要多花些时间,我会花在这里:更多角色,让现有角色再鲜活一点,这样街道才会有动感,也有点个性。

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 83e5d93f-772b-4309-a3fb-2ebc71195250

然后,就是那些点睛之笔。

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

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - c01275da-0546-4785-9bee-a5f0cdc62ebc

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

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - b00e521c-d39a-4867-893f-5a7da668178b

骑手摔倒动作预览

窍门:做实验、开游戏分支,先测试功能想法,再把它们合进来。

我想要砸碎窗户这个效果,但不确定能不能成,所以就在独立分支里试了。

只做砸窗户,用一个完全独立的镜头,拉近窗户,在撞击时停留,再转回骑手身上。第一轮之后,我把终点的滑板公园拉长,让它更像个训练场,让路线以一段好玩的内容收尾,而不是就这么停下来。

后来我又做了更大的豪宅,沿街摆进去,让街道更有变化。最重要的是,我做了一套全新的天气系统。先做小东西,比如驶出水坑时溅起的水花和留下的轮胎印,然后做出一整天都在下雨的日子。

这些东西能让游戏活起来,增加层次。

这款游戏本来很容易就会变成一条平路,反复玩同样的一趟,直到刷到最高分。把这些东西混搭起来,就多了一个维度,而审美真正重要的地方就在这里。

网站也是一样。没能让我立刻上线的,就是要把网站做得像那么回事,把整个概念都包进去。落地页是一份报纸,成绩页是一份报纸,排行榜也是一份报纸。我觉得这方面自己做得还行。

花了多少

DevClocked 把一切都记了下来。从 7 月 1 日第一次规划提交,到 9 月 12 日,也就是部署上线四天后:

  • 记录覆盖了 39 小时,其中 25.2 小时计为人在场,13.8 小时为智能体单独运行

  • 15.6 亿个 token,其中 15.3 亿个是缓存读取

  • API 用量折合 $2,175,这不是我的账单

  • 跨 11 天,共 90 次提交

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - 2f44ed2c-12e4-47ef-8f3e-7f965d16c376

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

用 Blender 和 GPT 5.6 Astra 制作一款完整游戏(不只是演示) - cf133daa-9b5d-4a26-960d-dae84668879e

八次提交,然后空了两个月。9 月重做浏览器版,开发用了四天,第五天上线,大家现在玩的就是这个游戏。7 月那段时间,我也不算完全后悔,因为需求说明和模拟设计都留了下来。但如果一开始就从浏览器做起,我第一天就能有个能玩的东西。

还有些没解决的问题,我宁愿说出来,也不想装作没有。手机上能不能持续保持 60fps,还没得到验证。一次受控测试稳住了,另一次平均是 58。Meshy 做的骑手有 88,550 个三角面,因为我保留了那张脸,而且我还没在真实手机上对它做过性能测试。

太长不看版:如果你也想做,顺序如下

  • 先用自己的话写需求说明,再挑一份最接近你想要效果的参考,哪怕那就是你不能照搬的东西。

  • 把需求说明和两三张粗略的图片交给模型,先别给美术方向,等玩法机制能玩了再说。

  • 引擎和外观分开对话推进。

  • 用 Python 在 Blender 里做道具,这样每个素材都能重新生成。

  • 角色需要脸的时候,先在 ChatGPT 里做概念图,用 Meshy 出网格,再交给 Astra 做减面、绑骨骼和适配。

  • 每改一次,都要有供审查的渲染图。留一天给那些点睛之笔,天气、砸窗户、终点的公园,因为这些才会让人觉得值得再玩一次。

  • 记录你的工时和 token 用量,因为你会想知道的。

然后给它挂上一个域名。

我这款就在 paperroute.lol,那里的开发日志记着它背后的每一个检查点、每一张渲染图、每一个小时。