跳到正文
Qiita · Unity 开发社区· 来源· candynex·· 2 小时前精选AI 评分82

用Gemini和Claude Code在26天内制作5.2万行游戏并上架Steam的实战经验

コードを1行も書かずに26日で5.2万行。Gemini と Claude Code と「情シスのインシデント対応」ゲームを作って Steam に出した話

推荐理由

作者公开了26天完成5万行AI游戏的架构设计与7个踩坑案例,提供了可迁移的大规模AI开发验证方法。

正文 · AI 翻译

本文分享的内容(给未来用AI制作游戏和应用的人)
让AI编写“数百行脚本”很简单,但要让它一行代码都不写就做出“5万行、超过100个关卡的游戏”,如果按常规方法操作,上下文会溢出并导致100%失败。
本文将公开在26天内、总计消耗47亿token完成Steam平台游戏的过程中所构建的“能让AI自主运行和自我验证的Harness设计”,以及“实际踩过的7个坑及其规避策略”。

1. 实证结果:在26天内与AI们共同制作的东西

首先,展示一下本次介绍的这种方法论能够实现多大规模的项目,这里提供仓库的实际数据(截至v1.0版本)。

項目 規模(実数)
C# 代码(Unity + 终端引擎) 约 52,200 行(137 个文件)※人类手写代码为 0 行
Python 代码(剧本生成与检查) 约 10,900 行(18 个文件)
自动测试(冒烟测试) 1,646 项(包含全 104 话及隐藏关卡的通关验证)
已实现命令与场景 Linux 命令 80 种 / 场景 主线 104 话+入职前培训+隐藏关卡
Claude Code 总 Token 数 输入约47.3亿(现金98.6%)/ 输出约1,140万
开发期间·提交次数 26天(实际运行22天)/ 198次提交
变更日志·手动测试步骤(MD) 变更日志167项 / 手动测试步骤121节

主题是,将我21年的SE经验浓缩其中,用Linux命令管道镇压黑心企业事故的模拟游戏『战斗的信息系统部』。
qiita_88.gif

※当此规模的开发项目,与常规项目一样,标准化和基准书等「机制(环境设计)」不可或缺。

2. 角色分工与技术选型:以“AI不迷茫、自己不动手”为最高优先级

为何选择“Unity (C#)”?

如果是基于CUI的游戏,Electron或Godot也是选项之一,但通过与Gemini进行头脑风暴后,我们以「AI能否最准确地编写代码」为标准,最终采用了Unity。

  1. Claude的学习量与自足能力:鉴于Unity特有的生命周期、uGUI控制以及C#类设计的训练数据丰富,我们判断让Claude自主推进打字特效和日志滚动控制较为容易。
  2. Steamworks.NET的实绩:由于网上关于全部9种成就解锁及通过Steam Cloud进行存档同步的案例众多,仅凭Claude就能顺利实现而无需迷茫(虽然在商店审核阶段因AI使用披露栏英文内容过短及胶囊图文字规定被退回两次,但连同构建审核在内最终顺利通过)。
  3. 演出的简洁性:后半段的“警告红灯闪烁”、“黑色KVM控制台”、屏幕晃动以及服务器机房的风扇环境音等,都没有使用复杂的功能,仅通过uGUI的颜色和主题切换与AudioSource即可实现。

qiita_image2_themes.jpg

四方团队体制:原案由Gemini负责,实现与维护由Claude负责

Qiita用4人.jpg

  • プランナー 兼 監査役:Google Gemini(3.1 Pro)
    • 平衡“黑色幽默”与“现场正确教训”的剧本原案、命令谜题的关卡设计
    • 完成剧本(MD)的审核、为图像生成AI制作英文提示词
  • リードエンジニア:Claude Code(Opus 5 → Fable 5.1 → Opus 5.5)
    • Unity(C#)及Linux命令模拟器(终端引擎)的实现
    • 将原案转化为剧本数据(Python生成脚本 → 阶段JSON)并润色台词
    • 整合性机械检查、自动测试、与实体机(WSL)的对照,以及根据规格变更更新MD
  • アートディレクター:NanoBananaPro2
    • 从游戏内资产创建Steam商店横幅(使用Gemini生成的英文提示词)
  • プロデューサー 兼 テストプレイヤー:私
    • 提供21年的现场经验,进行“这很有趣/这令人不适”的判断,以及「观看画面」

实际开发中的感受是,Claude可以按照指示修改细微的对白,但
在构思想法和润色方面非常不擅长。

因此,润色工作主要由Gemini 3.1 Pro负责。
相反,Gemini在陪练时有“附和”的倾向,因此需要适当区分使用。

3. 【设计的核心】防止AI驱动开发崩溃的两种架构

在让AI共同完成5万行代码的游戏开发中,以下两项设计最为关键。

① 将游戏的核心部分从Unity中分离(无头化)

铁律:AI无法操作GUI(Unity编辑器)
如果采用“必须启动Unity才能进行功能验证”的设计,人类就不得不每次手动进行测试游玩,导致开发速度急剧下降。核心在于尽可能扩大无需编辑器即可验证的范围。

因此,我们将命令解析、虚拟文件系统、通关判定等“终端引擎”部分剥离出来,使其完全不接触UnityEngine,作为纯C#(Pure C#)独立实现。
此外,窗口和按钮等UI也不手动放置到场景文件中,而是改为在启动时通过代码动态构建的方式,从而减少了被要求“重新制作场景”的次数。

这样一来,Claude在修改代码后,无需启动Unity,只需使用普通的C#编译器进行构建,即可通过命令行高速运行1,646项自动检查。

② 将Markdown(MD)设为“唯一信息源(Single Source of Truth)”

在与生成式AI进行大规模开发时,最可怕的是因上下文遗漏而导致的时间线和设定不一致。Claude Code在会话变长后会对上下文进行摘要,但由于“对话会消失,但MD会保留”,所以我们将所有信息都汇总到了MD中。

  1. 通过事前定义构筑防波堤:将世界观、时间线、登场人物、各集的通关条件等全部定义在MD中,并要求在实现前务必阅读。
  2. 变更履历的连续编号管理(共167件):规格变更时,将“变更内容与经过”带连续编号地累积到MD文件的上部。这样下一个会话中的AI就能继承“为什么会变成这样”的信息。
  3. 将手写部分与从数据生成的部分分开:各集的列表(日期时间、委托者、解放指令、通关条件)每次都从关卡数据用脚本生成并写回 MD,从根本上消除了台本与资料之间的偏差。
  4. 手动测试步骤也积累到MD中(共121节):每次修正时,都逐节追加“输入什么、达到什么结果算合格”。人工试玩就是按照这些步骤进行的。
  5. 明确“约定事项”:像“提交要等我要求之后”“不要使用字体中没有的字符”这样的规则也写进MD,让其在跨会话时也能被遵守。

【场景MD文件摘录(规格变更记录)】
qiita_image3a_changelog.png

【场景MD文件摘录(各阶段设计)】
qiita_image3b_overview.png

实际共享资料(MD文件)的摘录

【角色与人格定义示例】

铃木董事:4个系统全部 admin1234,在共享文件夹中以明文形式放置一览表。凌晨3点打开预算文件。11月16日与供应商密谈(不告知情报系统部门,将日志保存期缩短至30天,使用维护用账户进行操作)。"别显示在画面上""销毁证据,这是业务命令"。

【世界观与公司企业文化定义示例】

绝对的上位关系与对传统模式的沿袭:职位具有绝对权威,甚至在数字系统中也要体现对上级的尊敬。例如“盖章角度规定第41条(向左倾斜5至15度按下=鞠躬章)”就是将现实中存在的陋习系统化的产物。

【满足条件的类型定义示例(数量由数据自动统计)】

型 意味 使用数
run_command 输入指定命令 118
submit_answer 在聊天窗口或控制台中发送答案 23
kill_all_malicious 停止所有恶意进程 3

4. “万无一失”是谎言:实际踩中的7个地雷及解决方案

即使将MD作为中心,崩溃仍会发生。关键在于建立一套让机器和人类都能发现崩溃的机制。以下是团队实际踩中的地雷及其修复方法的记录。

地雷①:检查脚本“读取0件即判定合格”

用于发现剧本矛盾的检查脚本以相对路径持有剧本的位置。

STAGES = os.path.join("Assets", "StreamingAssets", "Stages")   # 実行した場所に依存する

从其他目录运行时,连1集都读不了,却仍然显示“剧本封面与内容一致”,程序照常运行。由于改变执行位置后结果发生了变化,Claude自己找到了原因。

  • 解决:将路径改为相对于脚本所在位置进行解析,并如果一件也读不到就判定为失败。修改后立刻发现了5处隐藏的偏差。
  • 教训:编写检查逻辑后,要一起验证“故意破坏时是否会崩溃”。通过测试并不能证明任何事。

地雷②:被默默丢弃的配置键

第52话是“向账本上没有的服务器发送 ping 以确认存活”的一集,但在测试游玩中发现了这样一个bug:ping 实际上是 100% loss ,但请求者却回复说“已确认可达性”。

qiita_image4_ping.png

原因是剧本中写的是 hosts 这个键,而读取端只读取了 reachableHosts 。由于未知的键会被默默忽略,因此没有报错。

  • 解决:在生成脚本侧引入机制,将设置键与读取侧的列表进行比对,若发现未知的键则停止(在全部104集中,仅此1集出现了该问题)。
  • 教训:名称相似导致的混淆,无论是人类还是AI都会发生。“宽容式读取”会隐藏bug,因此应设置为不默默通过而是报错的机制。

地雷③:微小追加的不断累积,踩中了TextMeshPro的上限(16,383个)

在第33集中打开游戏内浏览器的手册时,上一页的文字出现崩坏并残留 IndexOutOfRangeException 。

qiita_image5_before.png

原因是TextMeshPro的上限限制(单个文本最多可拥有16,383个矩形)。由于持续请求“每次都是微小的追加”,如命令说明或图解等,结果在第24集超过了上限,最终话达到了4万至6万个。

  • 解决:Claude从堆栈跟踪读取到TextMeshPro的源码,实测了所有集数的页面大小后,提出了将正文按每5,000个为单位分块绘制的方案并进行了实现(分割位置的判定已通过模糊测试验证)。
  • 教训:正因为对方会欣然答应请求,所以请求方和被请求方都没有对数量设定上限。请在关键节点进行实际测量。

地雷④:从最初的提交开始就损坏的成绩保存(通过AI之间的交叉审查发现)

“读取”函数带有“恢复成绩”的副作用,导致每次自动保存时成绩都会回退到文件中的内容。由于游戏不会崩溃且不会报错,因此无人察觉。

  • 解决:通过在提交前运行Claude进行的AI之间多视角审查发现了问题。为每个视角设立审查角色,让其他AI验证“能否反驳”发现的指摘,最终修正了幸存下来的5项问题。
  • 教训:与人类团队一样,务必经过不同于撰写者本人的视角(不同视角、反证角色)。

地雷⑤:对于“和真机一样吗?”这个问题,不应依靠知识,而应通过真机(WSL)来回答

出于教育目的,我坚持让它在“与实物相同的行为”上保持一致。当询问在通过 top 到 q 时画面是否会消失时,Claude 诚实地补充道:“这是基于知识的判断,未在实物上进行过确认。”于是,我在 PC 内的 WSL(Ubuntu)中记录了包含模拟终端的输出,并计数控制字符以进行验证。

命令 进入替代画面(ESC[?1049h) 从替代画面返回(ESC[?1049l) 退出时
top(procps-ng 3.3.16) 0 回 0 回 画面不消失。最后一帧保留下来
less 1 回 1 回 返回原始画面

用同样的方法,我们还发现 sed 的错误文本位置偏移了一位(实机为 char 11,游戏为 char 12)。

  • 教训:准备一台可供 AI 进行验证的实机(WSL 即可),并要求其分别报告“已确认的事实”与“基于知识的推测”。

地雷⑥:主动汇报提案的前提是错误的

Claude 提议将终端历史的上限设为“15,000 字吧。普通输出要少得多”,我同意了;但在实现前,Claude 重新测量了全部 104 话的输出量,并报告说:“本篇的 28 条日志会超过 15,000 字。刚才的说明是错误的。”

  • 教训:带有数字的提案应在实现前请对方实测。欢迎指出错误、能轻松开口的关系,最终反而能提升质量。

陷阱⑦:画面看起来不像AI生成的

“页码出现在纸张正中间”“文字重叠”“场景中保存的值优先于代码默认值”这类问题,对于看不见画面的 AI 来说无法自行观测。由我截图后交给它是最快的办法。
qiita_image6_before.png

  • 教训:人类负责“观察”与“判断”,AI负责“日志、原因与修正”。试玩(进行了2周)不能省略。

5. 支撑质量的机制:每次修复都会运行的6项自动验证

每次修正时,都会自动通过以下所有检查,无需启动Unity。

  1. 剧本生成(Python → 舞台JSON)以及剧本之间的比对
  2. 冒烟测试(共1,646项检查):在不使用Unity的情况下编译终端引擎,并实际运行所有剧情的正确步骤以验证能否通关
  3. 针对Unity的编译确认
  4. 字体检查:若使用的字体中混入了全角的“!”或“?”等字符,会导致乱码(豆腐块),因此会扫描所有文件
  5. 存档数据删除遗漏检查
  6. 更新变更日志与测试流程的MD文件

qiita_image7_checks.png

6. 实际花费:模型、套餐、Token、时长

基于 Claude Code 的会话记录(JSONL),从编码开始到 v1.0 构建完成的所有会话,去重后统计的实际数值(不包含 Gemini 和图像生成 AI 的部分)。

開発期間(26日間 / 実稼働22日)

項目 日付
编码开始(首次提交) 2026-09-05
增至全部 100 话 2026-09-07
全部 104 话及隐藏关卡的重制(剧本第 6 版) 2026-09-14
第2周测试游玩的修正 2026-09-18
连接至Steam(成就、构建与分发机制) 2026-09-25
v1.0版本构建(冻结) 2026-09-30

使用的模型与Token明细

模型 使用期间 主要共同完成事项 回复数量 输出令牌
Claude Opus 5 9/5〜9/14 终端引擎与界面基础,共100集的框架,KVM控制台 約 4,100 回 約 462 万
Claude Fable 5.1 9/8〜9/25 研修与设定,全部104话的重制,与实机的全面检查,第二轮的修正 約 2,800 回 約 497 万
Claude Opus 5.5 9/25〜9/30 支持Steam(成就、云存档、分发),发布前的审计 約 3,200 回 約 175 万

(※此外,9/10至9/12期间Claude Opus 4.8有13次响应)

項目 Token数量
输出(AI编写的代码、剧本、说明、报告) 約 1,140 万
输入(包含每次重新发送的对话上下文) 約 47 億 3,000 万
其中来自缓存的重新读取 約 46 億 7,000 万(98.6%)
其中新读取的内容 約 6,500 万
响应总数 約 1 万回

最初从 Claude Pro 开始开发(使用 Opus5.0),但最终因令牌量不足和质量不佳,改为 Claude Max 5x(使用 Fable5.1)。即便如此令牌仍不够用,最终升级到了 Claude Max 20x 计划(使用 Opus5.5)。

特别是在 Opus5.0 中退化现象较多,虽然升级到了 Fable5.1,但在质量与性能的权衡下,令牌的消耗量极其惊人。Opus5.5 发布后,令牌的消耗量趋于稳定,真是帮了大忙。

基本上,通过以Opus5.5为基础并将Effort设为超高,同时开启Ultracode,Token和品质都一下子稳定了下来。

正因为采用的是API的固定套餐而非按量计费,所以才能毫不迟疑地运行一万次,每次进行烟雾测试输出的读取以及加载超长的MD文档。

结语:致各位工程师

所谓“由AI制作”,实际上是“让AI制作、让AI检查,而我则游玩并做出判断”。
人类作为制作人,负责准备MD的中枢环节和验证环境,并非甩手不管,而是盯着屏幕、游玩并做出决定(例如,在试玩中只要感到任何不适的BGM或煽情演出就将其剔除,而在真结局中选择只保留粉丝声音的安静演出)。这就是人类一方的职责所在。

游戏正篇中,我融入了这样的“现场的真实感”与“Linux哲学的快感”。

  • ps aux | grep enc-worker | awk '{print $2}' | xargs sudo kill -9 仅用这一行代码,就一次性终止了12个失控进程
  • 从2万行的syslog中,仅提取出grep里可疑的8行
  • 最后的办法是让保安人员跑过去,物理上拔掉LAN电缆

《战斗的信息系统部》是写给所有直面不合理社会与系统的工程师的情书。

请尽情体验凝聚了21年现场实况的“Linux哲学的宣泄”。
(如果您是IT行业新手,不妨将其作为CUI环境的练习场。)

🎮 Steam商店页面在此: 《战斗的信息系统部》

价格为480日元(发售7天内享受15%折扣,即408日元,约一杯咖啡的价格)。仅限Windows(64位)使用。
※游戏内的命令均在虚拟环境中运行,不会触碰您个人PC上的任何文件,请放心输入(顺便一提,rm -rf /在游戏中也能正常停止)。

即使暂时还没有时间玩的朋友,也请加入愿望单,这将是对我们的鼓励!

如果您对提示词的构思或AI之间的协作流程有任何疑问,欢迎在评论区提问!

来源:Qiita · Unity 开发社区 · qiita.com