
用 Blender 和 GPT-6 Astra 做出一个完整游戏,而不只是一个演示
PaperRoute 的完整 run book:机制先行、美术后置,引擎与外观分两条对话,Blender 由 Python 无头驱动,Meshy 补脸,审查渲染驱动迭代;39 小时里三分之二无人值守。
我用 GPT-6 Astra 做出了一个完整的游戏,演示视频在 X 上传播开来。最初只是一个 one-shot 演示,四天后它变成了一个完整可玩的游戏:PaperRoute,一款设定在美国街区的 Paperboy 风格送报游戏。代码由 Astra 编写,模型由 Blender 生成,整件事是在几个会话里完成的。
那次令人印象深刻的 one-shot 是真的,但它并不是重点。做出一整个游戏完全是另一回事,而让画面看起来是「有风格的」而不只是「被生成出来的」,也远不止提示模型一次那么简单。下面这份 run book 记录了一个能跑、好看、又不只是单一样板的游戏是怎么做出来的,顺序与实际发生过程一致。每一小时、每一个 token 都被记录下来,所以后面的数字是真实成本,而不是主观感受。游戏站点上还有一份完整 devlog,覆盖每一轮对话、每一个界面和每一项统计。
背景:七月那次卡住的尝试
回到七月,同一个想法被交给了 Fable。当时写了一份 brief,要做 Paperboy 的现代版本:周一到周日一整周的送报、订户与非订户、狗、汽车、斜角镜头。目标是除了 Web 版之外还要有原生 iOS 构建。
它推进到了一条灰盒街道和一个骑手,然后就停住了。Fable 最终能搞定的只有一辆侧向躺着的自行车。客观说,这与其说是模型的失败,不如说是没能抵达设想的位置:Fable 本身令人印象深刻,进展也是真实的,但它始终没有变成脑子里的那个游戏。
第 1 步:从一份你自己就相信的 brief 开始
这个概念不是 Astra 给的。Astra 发布时,看完 OpenAI 的演示,就觉得它可能是这个 brief 的完美匹配,于是把原来的 brief 重写了一遍,而不是直接复用。
提示词本身很简单。用平实的英文描述了原版游戏和部分机制,然后描述了新版本应该做什么。这个阶段只关注机制,外加一张视角参考图:原版 Paperboy 的镜头角度。
目标从来不是复刻 Paperboy,而是取走这个概念,给它一个新的转向。但如果你要给模型一个起点,就给现存最好的那一个;对一个自行车送报游戏来说,最好的基础就是原版。先把机制做对,等它可玩了再去转向。
第 2 步:定下游戏方向
这里把两件事拆开,但都跑在同一个线程里:美术方向与游戏方向。
第一次 one-shot 之后就有了可演示的东西。它给出的等距视角和游戏风格值得保留;而游戏方向、机制、镜头、观感和手感都不行。那一版本质上就是 X 上最常见的那类东西:一次生成、看着不错、确实有趣、有自己一套美术主张,界面也和别人发过的演示几乎一模一样。
那个阶段唯一重要的只有概念和游戏机制。在这上面再压一大堆美术方向,只会把两者都稀释掉。
这个决定在第一个晚上就回本了。Astra 在午夜前的六次提交里搭出了一个浏览器版本:确定性模拟、可瞄准的抛物线投掷(报纸落在虚线弧标示的位置)、邮筒计分,以及一条以公园赛道收尾的路线。它一边写一边补测试,这一点的作用超出预期,因为此后每一次美术改动都有一套测试可以跑。
第 3 步:定下美术方向
第一遍把镜头角度和游戏手感确定下来之后,就可以一边继续提示模型改进机制和投报动作,一边把美术方向调细。
概念图出自 GPT。游戏在编译时,工作从 Astra 跳到 ChatGPT,喂给它几张参考图,产出概念美术和情绪板。它不是所谓「吉卜力」风格,那个词一次都没用过。实际给出的是一段描述性参考:一部清冷的日本夏日微风电影,带手绘纹理效果。GPT 返回一份风格参考情绪板,之后就以它为基础继续调。
这是刻意为之:此时不想让提示词被「游戏到底该长什么样」的细节塞满。
两条工作流,一个线程
通常会把这些拆成独立线程。但配合新的工作流和自己定制过的 T3 code form,留在一个线程里看起来正是好机会,而 Astra 在这件事上比 Fable 更能扛。你可以中途打断它,它似乎也不会掉链子。
两条流都是逐条提示词迭代:美术方向和游戏同时推进,MacBook 被烤得发烫,Blender 在后台无声运行,不时送来相当漂亮的渲染和通过的测试。整个过程中,演示版一直挂在 URL 上,并且基本随时可玩。
引擎那条流是枯燥重复的那一条,也是最愿意原样再来一遍的那一条。松手就回正的转向;一次撞击恢复窗口,让同一个垃圾桶不能连吃三条命;真会追人的狗,可以被甩开也可以用报纸引开;移动端操作是拖动转向、按住踩踏、点按投掷。每一条都是一次提示、一次在浏览器里看结果、一次提交。
用 Python 驱动 Blender,而不是 MCP
风格那条流是 Blender。Astra 并不打开 Blender,它写 Python 让 Blender 无头运行,走的不是 MCP。游戏里每一栋房子、每一棵树、每一段栅栏和每一个邮筒,都是一个脚本:建网格、拆材质、导出 GLB。
第一遍是一份独立的夏日美术研究:一整页房子剪影、树形和街道道具单独渲染出来,在它们进入可玩世界之前。然后是房屋家族,然后是更密的庭院,然后是手绘质感的表面。第二天上午十点,已经有了七个房屋家族。
把两条流分开,是最值得照抄的一点。当一栋房子看起来不对时,你最不想做的事就是在同一个线程里跟模型争论投掷物理。
第 4 步:自定义模型,Meshy 在这里体现价值
Astra 很擅长房子和相对简单的东西,但要让它们好看,需要在每一栋房子上投入关注和提示。主骑手则是另一回事:它看起来像个木偶,Astra 也做不出更好的,而且它绝对做不出一张脸。
这时候有两条路。要么去下载免费的 Blender 素材,要么——如果心里已经有一个具体角色——在 ChatGPT 里生成图片,再送到 Meshy。花 8 美元大约换到 300 次图片生成,而且离配额上限还很远。
这套流程很直接:把图片上传到 Meshy,取回一个可下载的 3D 模型,丢进 Astra 让它简化多边形。结果就是游戏里一个视觉站得住的自定义 3D 模型。只靠 Astra 反复迭代骑手,烧掉大量 token 却毫无进展;在用上 Meshy 流程之前,这个模型一直很差。
把新模型套到已有的自行车上花了些来回,但最终达到了一个过得去的结果。不完美,但过得去,继续投提示词还能更紧。
由此得出的经验:把绑定做扎实,限制就变成了 SKU,而不是模型本身。
第 5 步:补细节
one-shot 游戏缺细节,也缺打磨。新奇感是自带的,但自定义动画和更好的 UI 才让游戏感觉是真的。眼下的进展确实不可否认,能做到的事相当惊人;但品味(以及耐心)目前仍然是护城河。
实际会话时间和 agent 轮次里,大约 80% 花在打磨、修糟糕的网格和提示细节上,而不是搭建游戏。对 PaperRoute 来说,这份精细化的分量很重。
Astra 写了 Blender 脚本,把身体在多边形上压到游戏预算之内,同时保留原来的脸、发束和帽子接缝;重建袖子和手臂,让皮肤不会从衬衫里戳出来;把短裤裤脚从腿上分离;把整套东西贴合到已有的自行车上,配好握把接触和踏板接触;再用 23 根骨骼绑定,其中三根给头发、三根给衬衫下摆,让它们随速度摆动。
大约 30 次提交读起来像一本裁缝笔记:修复骑手服装几何、重建骑手手臂与袖子、保留短裤裤脚、给自行车换更直的 BMX 车把。
同一套循环随后用在了两个角色上:拿着报纸走出家门的暴躁老人,和拿着玩具遥控器的小男孩。概念在 ChatGPT,网格来自 Meshy,脚本在 Blender 里由 Astra 写,然后绑定、审查渲染、进游戏。一旦这条流水线存在,第二个角色的成本只有第一个的一小部分。
审查渲染才是真正的工作
这一点是中途才想明白的。早期就提示并搭好了一套始终循环审查工作的框架:让 agent 自己检查模型哪里不对,对该模型做独立渲染,再送回来给人审查。从渲染一到渲染二,全部改进里有 60% 到 70% 是 agent 这样自己跑出来的。
你审查模型做的 3D 工作,靠的就是看渲染。Astra 搭了捕获脚本,让真实的 Three.js 骑手过一遍转向、投掷、冲刺和摔倒姿势,每次保存正面、侧面、背面和 clay 转身图。devlog 里每个检查点旁边都放着这些渲染。发现哪里不对,就指着那一帧说帽子没盖住头发,那就是提示词。
第 6 步:加入品味与点睛之笔
上面全是流程。流程给你一个能跑的游戏,但给不了一个别人愿意玩第二次的游戏,中间那段差距是品味,必须由拿着 brief 的人自己补上。你没法一路 one-shot 出一个好看又完整的游戏,最后只会得到一堆粗糙的产物。
这里的一部分品味是扔东西。原来的模型几乎全被扔掉了,换成完全自定义的角色。游戏的美术方向就体现在那个老人和拿遥控器的小孩身上。如果还有更多时间,会继续投在这里:更多角色,并且让现有角色更活一点,让街道有动感、有个性。
然后是点睛之笔。碎窗效果单独开了一整条分支,下雨天也是。两者都在同一个流里,但是两个独立的 subagent 线程,各自有新的 worktree 和新的游戏版本,可以隔离测试,随时准备合入。
还有一整块时间花在把摔倒动作调细上。
这个模式值得说明白:跑实验和游戏分支,在把想法折进主线之前先验证。碎窗是想要的,但不确定它能不能成,所以放在自己的分支里测:一套完全独立的镜头,推近窗户、停在撞击瞬间、再摇回骑手。第一遍之后,把终点的滑板公园拉长,做成更像一个训练场,让路线以一个有趣的东西收尾,而不是戛然而止。
随着推进,又做了更大的宅邸沿街放下,给街道一些起伏。最重要的是搭了一整套新的天气系统:先做小事,水坑溅起的水花和碾出的胎痕,然后是一整个纯粹的下雨天。
正是这些东西让游戏活起来、有了层次。没有它们,这很容易只是一条平路,玩一遍然后反复刷最高分。把这些混在一起,才是品味真正起作用的地方。
网站遵循同一套逻辑。阻止它立刻上线的,是让网站可信、把整个概念包进去。落地页是一张报纸,成绩单是一张报纸,排行榜也是一张报纸。
成本是多少
DevClocked 记录了全部。从 7 月 1 日第一次规划提交到 9 月 12 日,也就是托管版上线后的第四天:
- 39 小时被跟踪的覆盖时间,其中 25.2 小时有人参与,13.8 小时纯 agent
- 15.6 亿 token,其中 15.3 亿是缓存读取
- 2,175 美元的 API 价值,这不是实际账单
- 11 天内 90 次提交
在场跟踪从 9 月 6 日才开始。在此之前,被跟踪的时间默认算作有人在场。在那之后,三分之二的被跟踪时间里键盘前没有人。
八次提交,然后是两个月的空档。九月的浏览器重建花了四天开发、第五天上线,那才是大家现在在玩的版本。七月并不完全值得后悔,因为 brief 和模拟设计都活了下来;但如果一开始就在浏览器里做,第一天就会有可玩的东西。
还有两件事没有解决,与其假装不如直说。手机上持续 60fps 未被证明:一次受控运行保持了 60,另一次平均 58.3。Meshy 骑手有 88,550 个三角形,因为保留了脸,这个模型还没在真机上跑过基准。
TLDR:如果你想自己做,顺序是这样
- 先用自己的话写 brief,并选出最接近你想要的那一张参考,哪怕它正是你不被允许复刻的那个东西。
- 把 brief 和两三张草图给模型,在机制可玩之前先按住美术方向。
- 引擎和外观分开成两段对话跑。
- 在 Blender 里用 Python 做道具,让每一个资产都可复现。
- 当角色需要一张脸时,在 ChatGPT 做概念、从 Meshy 拿网格,再交给 Astra 减面、绑定和贴合。
- 每次改动都拿到审查渲染,并留出一天做点睛之笔:天气、碎窗、终点的公园,因为那才是让人愿意玩第二次的原因。
- 记录你的小时数和 token 数,因为你一定会想知道。
然后把它放到一个域名上。这个在 paperroute.lol,站点上的 devlog 保留了背后每一个检查点、每一张渲染和每一个小时。
原文:How to build a full game with Blender and GPT 5.6 Astra (not just a demo) — Emm Tee (@builtbysketch);游戏与 devlog:paperroute.lol。
原文来源:Emm Tee / Xhttps://x.com/builtbysketch/status/2098773631249854478
