以下是一次实验的记录:AI管线能否将一款游戏从头带到商店发布,而不仅是原型或Game Jam参赛作品。答案是肯定的,但有限定条件,而这些限定条件正是有价值的部分。《最后之战:列车防御》已上线Google Play(Android)。从创意到发布的全部工作量:160小时。
分工情况
GDScript、美术、音效与音乐、平衡性调整、文本以及10种语言的本地化均由生成式AI完成。仓库中的提交由AI代理完成,验证工具也包含在内。我的工作是设定任务、构建代理运行的管线和工具、指定必须通过的关卡、审查并批准结果,以及在真机上测试构建版本。实验的重点在于工具而非游戏本身:在输出结果可信到足以发布之前,需要围绕生成环节安排多少验证工作?游戏内部没有使用生成式AI;所有内容均在发布前制作完成。
管线概览
代码:LLM编码代理在Godot 4.6仓库中工作,配有项目级指令文件、无头解析检查、运行真实应用数百帧的启动烟雾测试,以及直接跳入战斗的战斗烟雾测试。美术:通过Leonardo.ai和本地ComfyUI(运行于单块RTX 4090)使用扩散模型,背景移除采用ML分割。音频:本地运行Stable Audio Open。平衡:通过任务模拟器而非手动微调。文本:基于键值的.po文件,覆盖10种语言,配有提取和应用工具。
失败之处
- 代理编写了一个会在启动时清除玩家存档的bug。代码看起来没问题。审查和烟雾测试均未发现;专门的审计才将其捕获。看起来合理的错误代码是整个方法的主要失败模式,而且正是那种轻易就能蒙混过关的类型。现在,任何涉及存档模式的代码都必须经过加载往返检查作为规则。
- 音频模型无法处理短暂的瞬态音。爆炸声和音乐可用;任何低于约0.3秒的声音都会变成糊状。多个UI提示音仍保留程序化生成,枪声则是一个混合体:在合成频带噪声爆裂声之上叠加一层生成的轰鸣声,因为两者单独听起来都不像枪声。
- 尝试为预告片使用图像生成视频,但被直接否决。它不符合游戏的美术风格,而一个看起来像另一款游戏的预告片还不如没有。下面链接的视频是通过Godot Movie Maker直接录制的引擎画面。
- 后台代理会崩溃并丢失其工作成果。长时间无人值守的任务经常在中途被终止,因此任何耗时长的任务现在都在前台运行。一次意外的git checkout也曾导致未提交的本地化工作丢失;重建的文本需要人工通读,因为没人能分辨哪些行被静默重写了。
- 色度键背景移除吃掉了美术素材。泛洪填充算法无法区分深枪色与深色背景。ML分割解决了这个问题。
- 暖缓存解析关卡在撒谎。Godot在带暖缓存的
.godot下使用--headless --editor --quit会隐藏悬空的class_name引用,导致一连串“类未找到”错误指向一个存在的类,而真正的罪魁祸首是另一个未能编译的文件。现在有了冷缓存扫描和悬空类引用检查器。 - 最蠢的性能bug:启动路径中每项都有的
print()在Windows上浪费了超过一秒的启动时间。在分析任何更复杂的问题之前,先搜索print(。 - 给想开始同样实验的人的建议
生成从来不是瓶颈。信任输出才是。大部分人工精力都花在了关卡上:决定哪些检查在提交被接受前运行,哪些在真机上运行,以及哪些无论看起来多么干净都必须进行审计。跳过这部分,你就会得到一个装满自信代码但无人审查的仓库。
游戏本身背景
柴油朋克风格街机式AA生存游戏,竖屏,单指操作。一列装甲列车坚守阵地,敌人从上方俯冲。防空炮塔自动射击,你无需瞄准;手指拖动收割区域以捕捉坠落的水晶并触发反应堆能力。每次升级提供三张卡牌供选择(不可跳过),每场任务大约有十三次这样的决策。9种武器,每种5级;3级时武器分叉为三条路径之一(9种武器共27条路径),当两个武器同时装备时自动形成配对。10个生物群落,每个10个任务,共100个任务,每个生物群落以阶段性Boss结束,其他任务中则出现小Boss;你可以从任何已解锁的生物群落开始。每轮之间,水晶投入升级树,还有四种机车、携带反应堆能力的车厢、六个角色和四种稀有度的模块、研究、奖励箱和生物图鉴。游戏免费游玩,无体力或计时器;单人游戏,离线可玩;每个任务持续几分钟。可选内购,广告仅奖励性质。在Helio G85上可维持30帧。
Google Play: https://play.google.com/store/apps/details?id=net.didogames.thelastwar
演示视频(70秒,引擎录制): https://www.youtube.com/watch?v=iQkJA8OJrKU
新闻资料包(含完整生成与非生成内容列表): https://didogames.net/en/press.html
网站: https://didogames.net/en/
欢迎对管线、验证框架、模型选择或上述任何失败点提问。
评论 (0)