用 AI 重制了一个八年前的小游戏:Duck's Trip

我刚刚发布了全新重制的小游戏 Duck’s Trip。上一次更新,是 2018 年 4 月 17 日。

难以置信,八年过去了。

为什么要重做一个已经不再维护的小游戏?

我的工作重心早就不在游戏上了,也不打算继续做新的游戏。那为什么还要花时间重新做这个小游戏呢?

原因很简单:每天都还有人在下载它。虽然多的时候也就十来个,但日积月累,也是一个不小的数字。

Distribution history

具体来说,我有三个想法:

  1. 导流:在游戏中加一个 App Showcase 网站的链接,给我做的其他 App 引导一点点流量;
  2. 美化:最初做的游戏实在太丑了。既然它还在线上供人下载,我希望它能更好看一点;
  3. 实验:想试一试用 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