用 AI 重制了一个八年前的小游戏:Duck's Trip
我刚刚发布了全新重制的小游戏 Duck’s Trip。上一次更新,是 2018 年 4 月 17 日。
难以置信,八年过去了。
为什么要重做一个已经不再维护的小游戏?
我的工作重心早就不在游戏上了,也不打算继续做新的游戏。那为什么还要花时间重新做这个小游戏呢?
原因很简单:每天都还有人在下载它。虽然多的时候也就十来个,但日积月累,也是一个不小的数字。

具体来说,我有三个想法:
- 导流:在游戏中加一个 App Showcase 网站的链接,给我做的其他 App 引导一点点流量;
- 美化:最初做的游戏实在太丑了。既然它还在线上供人下载,我希望它能更好看一点;
- 实验:想试一试用 AI 开发游戏的完整流程——以前做不到的事情(包括我那有限的 Blender 知识),也许现在可以做到了。
从 Unity 迁移到 Godot
八年前,这个游戏是用 Unity 开发的。
新版 Unity 已经打不开当年的游戏源代码了。不过这不是什么大问题——Claude 只用了三个 Prompt,就帮我把项目改到能重新打开。
但我最终决定不再用 Unity 开发。原因很现实:打开 Unity Hub 要等 5 分钟,切换一个 Tab 要 5 秒。我的 MacBook Pro 是三年前的顶配机型,打开一个这么小的游戏都如此吃力,实在有点不可思议。
相比之下,Godot 的安装包只有 140MB,装完之后 2 秒就能打开。选择毫无悬念。
游戏的玩法本来就很简单,以前那点代码也没什么保留价值,于是我决定从零开始重制这个游戏。既然时间线已经走到了 AI 时代,自然要好好运用 AI 的能力。Godot 是个开源 IDE,这也让 AI 更容易理解和控制它。
AI 协作:两套 MCP 工具
Godot MCP
ChatGPT 建议我选用 godot-ai,而不是 godot-mcp。理由是:前者能够深度控制、维护也很活跃;后者虽然只提供基础操作,Star 数却更多,甚至还是 Google 搜索结果的第一条。
Blender MCP
在 Blender 这边,我用的是 官方版本,而不是 社区版。Grok 给出的建议是,官方版本更安全、兼容性也更好。
不过官方的安装指南写得有点语焉不详。我最终执行了 brew install llama.cpp,但并没有下载对应的 AI 模型(体积太大)。所以说实话,我到现在也不太确定 Blender MCP 究竟有没有真正用到 llama.cpp。
不管怎样,工具算是配齐了,可以正式开始制作游戏了。一周之后,游戏基本重制完成——全新的美术资源,全新的代码,而我几乎没有手写一行。
两个值得一提的插件
godot-admob-plugin
godot-admob-plugin 提醒了我一些 AdMob 的合规规范:对于射击类、跑酷类这种玩家不能分心离开屏幕的游戏,官方并不建议在游戏过程中显示 Banner 广告。于是我选择只在 Game Over 时才展示 Banner,尽量不影响游戏体验。
这一点对我来说尤其重要——之前我有另外两个小游戏因为广告问题被下架过,其实我当时并不清楚具体哪里做得不对。后来账号又因为闲置多年,被 Google Play 直接封号了(新注册的账号需要 20 个测试人员才能发布,所以我只能放弃 Google Play 这条路)。感谢这个插件里内置的合规审计逻辑,让我这次避免了重蹈覆辙。
GodotApplePlugins
GodotApplePlugins 用来接入 Apple Game Center。
这两类功能其实都有不止一种插件可选,最终我选择的都是近期仍在持续更新维护的版本。不过代价也很明显:接入 AdMob 之后,打包体积增加了 30+MB;再接入 Game Center,又多了 10MB。
说实话,我并不喜欢给一个 100MB 的游戏,硬塞进 40MB 跟游戏本身毫无关系的东西。姑且就当是一次实验吧。
一个 97KB 搞定全语言支持的字体方案
关于包体积,还有一个经验很值得记录。
非拉丁字符在 iPhone 真机上会显示成 Unicode 代码——总不可能为每一种本地化语言都塞进一个完整的字体文件吧?
最终我用 pyftsubset(fonttools 工具集的一部分)把游戏中实际用到的字符提取出来,再把所有需要的字体合并成一个文件,最终得到了一个 97KB 的 .ttf(而不是动辄 5MB 甚至更大)。这一个文件就支持了游戏里用到的所有语言。
这之所以可行,是因为游戏本身用到的文字量非常少,自定义字体裁剪成了一个简单又划算的方案。免费字体可以在 Google Fonts 下载。
游戏下载地址:Duck’s Trip on App Store