用 Agent 制作游戏
从剧本和一个素材文件夹到构建完成的游戏:Agent 一路做了什么,以及作者如何观察和介入
本文假定 Agent 已经连接,并且已有 Skill 或指南,见连接 Agent
准备剧本和美术素材
把剧本放在一个文本文件中,美术和音频素材放在一个文件夹中。在设置 → Agent 接入中打开 允许 Agent 修改工程,并把该文件夹添加到 允许导入素材的文件夹。不添加也可以,Agent 第一次读取该文件夹时,Studio 会询问作者是否允许
立绘需要透明背景,不透明的立绘会显示为一个矩形。Studio 可导入的格式:
| 类型 | 格式 |
|---|---|
| 图片 | PNG、JPEG、WebP、GIF、AVIF、SVG |
| 音频 | MP3、OGG、Opus、WAV、M4A、AAC、FLAC |
| 视频 | WebM、MP4(H.264) |
| 字体 | TTF、OTF、WOFF、WOFF2 |
缺少图片不会阻碍进度:Agent 会生成带说明文字的占位图并告知作者
分部件的美术素材,即 PSD,或按图层和标签各存一张的图片(如 mei_body.png、mei_eyes_smile.png),会做成分层立绘角色。配音录音可以放在同一个文件夹中,见翻译与配音
告诉 Agent 要做什么
例如:
用
~/Documents/my-novel/script.txt中的剧本和~/Documents/my-novel/art中的美术素材制作一部视觉小说。中文文本,1920x1080,两个结局
在显示 MCP 提示词的客户端中,make_game 提示词会启动同样的流程
确认需求
Agent 先检查连接,然后与作者一起过一遍简短的需求:标题、文本语言、分辨率、美术风格、角色、结局以及已有哪些素材。拿到剧本时,它会列出找到的场景、说话人和素材,剧本中提到却没有文件的内容,以及剧本从未用到的文件。在作者认可这份清单之前,它不会改动项目
让它开始工作
Skill 规定了工作顺序:
| 步骤 | Agent 做的事 |
|---|---|
| 连接 | 读取会话状态:打开了哪些项目、能否修改、可以从哪些文件夹导入 |
| 需求 | 确认要制作的内容,如上一步所述 |
| 项目 | 用骨架模板新建项目,或打开已有项目,并复用模板中的示例内容。空白模板创建的项目会安装骨架模板中可直接使用的界面。设置新玩家各项设置的初始值,例如文字速度和自动播放间隔 |
| 素材 | 以便于故事引用的名称导入作者的文件,为缺失的素材生成占位图。与已导入文件内容相同的文件不会重复导入 |
| 角色与变量 | 设置角色的姿态或分层立绘、名字颜色和对白头像,以及故事需要的变量 |
| 故事 | 每次调用写一个场景,包括分支,并让标题界面的开始按钮指向开场场景 |
| 界面 | 先设置配色与字体,再逐个页面调整样式,每一轮修改后都检查截图,并用 Gallery 的工具填充鉴赏界面 |
| 交互 | 仅为模板中没有的行为添加蓝图,例如解锁 CG,或在某个故事行授予成就 |
| 验证 | 运行检查直到没有错误,运行路线与结局测试,把每条路线试玩到结局,并在运行中的游戏里按下它接入或调整过样式的每个按钮 |
| 翻译与配音 | 仅在作者要求时进行:把游戏翻译为指定的语言,并把配音录音链接到对应台词 |
| 发布 | 构建游戏,报告做了什么以及留给作者的事项 |
接手
Agent 最后给出一份报告:做了哪些场景、路线和结局,游戏中仍有哪些占位图,各翻译语言和配音语言的完成程度,还有哪些事项留给作者,以及要打开的构建文件。项目仍在 Studio 中打开,作者可以继续编辑,也可以让 Agent 接着做
鉴赏界面
项目使用 Gallery 插件时(骨架模板即是如此),Agent 通过该插件自己的工具填充鉴赏界面。它先阅读插件的指南章节,再加入每张 CG 及其差分、每个关键场景的回想、原声音乐,以及有配音时的语音。鉴赏界面会显示目录中的全部内容,列出它们不需要新的蓝图
回想、音乐和语音会自行解锁:玩家进入场景、听到曲目或听到台词时即解锁。CG 则不会,它需要 Unlock Gallery 节点。指南为 Agent 提供两种运行方式:
- 在 CG 出现的那一行:故事行运行自己的蓝图,由该蓝图调用 Unlock Gallery,玩家看到 CG 的同时即解锁
- 从标题页面:适用于更适合用变量记录的情况,例如多张 CG 或多条路线共用一个标记:
- 为每张 CG 建一个持久变量,例如
seen_cg_rooftop,默认值为 false - 在场景中 CG 出现之后的那一行,用
/set把它设为 true - 在标题页面的打开事件上,读取该变量,为真时对相应条目运行 Unlock Gallery。标题页面在启动时和每次通关后都会打开,因此从它进入的鉴赏界面总是最新的
- 为每张 CG 建一个持久变量,例如
这些工具列在插件工具中
分层立绘角色
角色的美术素材分部件提供时,Agent 会构建分层立绘角色,而不是每个姿态一张图片:切换表情时眉毛、眼睛和嘴一起变化,服装保持不变。分层立绘见角色。Agent 有两种构建方式:
- 用按图层和标签命名的图片:导入的部件命名为
<character>_<layer>(始终绘制的图层)和<character>_<layer>_<tag>(变化图层的某个标签),例如mei_body、mei_eyes_smile和mei_outfit_casual,再说明图层的叠放顺序以及哪些图层一起变化,例如眉毛、眼睛和嘴同属一个expression轴 - 用 PSD:每个包含两个及以上图层的顶层分组成为一个轴,组内的图层即该轴的标签,其他图层始终绘制。各图层按完整画布尺寸烘焙并作为资产导入,隐藏图层不会导入。舞台无法绘制的混合模式(如正片叠底、滤色)所在的图层,会合并到下方图层或跳过,Agent 拿不准时会询问作者
每张图层图片都必须是完整画布尺寸,部件以外的区域透明,否则 Studio 会拒绝并列出各图片的尺寸。Agent 在书写用到某个组合的场景之前,会先预览该组合
把已有角色改为分层立绘,或从分层立绘改回姿态,会丢弃它现有的全部外观,选用这些外观的故事行会回落到默认外观。在 Agent 确认之前,Studio 会拒绝这种切换,Skill 也要求 Agent 先把受影响的行列给作者并征得同意
Live2D 和 Spine 角色由作者在角色编辑器中设置。Agent 可以读取它们,并用模型提供的名称书写驱动它们的行
对白头像
对白头像是对话框和对话记录中台词旁显示的面部图像。Agent 在设置角色时一并设置头像:一个默认头像,在没有更具体的头像时显示,包括不在场角色的台词和对话记录;以及每个姿态一个头像,分层立绘角色则按头像跟随的各轴组合各一个,通常是无论服装如何,每种表情一个。Agent 未设置头像时,作者打开角色面板时 Studio 会从立绘中裁出头像,Agent 会在报告中说明这一点
翻译与配音
Agent 只在作者要求时进行这两项工作,并且要等故事定稿之后:此后对台词的每次修改,都会让它的译文和录音过时
翻译
Agent 先把语言添加到项目中,然后先翻译名称,并与作者确定术语表,再翻译界面和具名键,最后按场景逐个翻译故事。翻译范围包括故事台词,角色、场景和结局的名称,界面文本,具名翻译键,以及插件提供的可翻译文本
- 游戏运行时填入的值(如
{0}),以及包围样式文字和停顿的标签都会保留。丢失了这些内容的译文仍会写入,但 Agent 会收到提示,并重新发送这些行 - 每一批都带着 Agent 读取时每一行的版本。作者在此期间编辑过的行会被跳过,并连同新的原文一起返回给 Agent
- Agent 写入的译文标记为 机翻,在翻译表的 审校 模式中审校。只有作者明确要求时,Agent 才会标记为 已翻译 或 已校对
- 每一批记为一步撤销,无论包含多少行。打开 跟随 Agent 的编辑 时,Studio 会打开该语言的翻译表
翻译本身见本地化
配音
Studio 不负责录音。Agent 把作者已有的录音链接到对应的台词:
- 设置配音语言。配音语言独立于文本语言,游戏可以显示英文文本、播放日语配音
- 按录音文件名规则列出每句配音台词的预期文件名,默认规则为
{scene}_{index}_{character}:场景名、该台词在本场景配音台词中的序号(001、002…)以及说话人。可以把这份清单交给录音方;录音文件按该规则匹配,如需改用其他规则,应在录音开始之前修改 - 把录音导入同一个资产文件夹,再把每句台词链接到资产库名称与预期文件名相符的资产。比较时忽略大小写、空格、标点、扩展名和文件夹,因此
Opening_001_Aoi.ogg和opening 001 aoi.wav都能匹配。两个资产或两句台词共用同一个名称时,不做猜测 - 逐条链接剩下的录音,并列出仍缺少录音的台词
新链接的录音显示为 已配音,只有作者说明已经试听过,Agent 才会标记为 已审听。匹配读取的是资产库中的名称,因此命名错误的录音只需重命名该资产。每次链接录音的调用记为一步撤销,打开 跟随 Agent 的编辑 时,Studio 会打开该语言的配音表
移植 Ren'Py 游戏
可选的 narraleaf-port-renpy Skill 指导 Agent 把已有的 Ren'Py 游戏移入 Studio,前提是游戏附带源码,即包含 .rpy 脚本的 game 文件夹。它以 narraleaf-make-game 为基础,因此两者都需要安装,见连接 Agent
- 用转换器,而不是手工移植:Agent 编写一个程序,一次性读取脚本,再由它生成每个场景的
.story文本。某项对应关系有误时,在转换器中修正后重新生成场景即可 - Ren'Py 与 Studio 的对应关系:Skill 说明了 Ren'Py 的语句、图像属性、位置与变换、角色、变量与持久数据、菜单和结局如何迁移,以及哪些媒体文件需要在导入前转换
- 对照运行中的游戏还原界面:Agent 运行 Ren'Py 游戏,截取每个界面,在 Studio 中对照截图逐一重建,再在 Studio 运行的游戏中复查。这一步需要本机装有 Ren'Py SDK
Agent 在原位置读取 Ren'Py 源码,从不修改;过程中生成的文件放在它自己的工作文件夹中
观察 Agent
跟随模式
打开 跟随 Agent 的编辑 时,Studio 会打开每次修改所在的编辑器,并短暂标出发生变化的元素或行。该选项默认开启,按项目记忆
跟随不会把 Studio 切到前台,在其他应用中的输入不会被打断;作者正在 Studio 的某个标签页中输入时,Agent 的标签页会在其后方打开
状态栏
Agent 工作期间状态栏变为绿色:调用进行时、最后一次调用结束后的 15 秒内,以及 Agent 处于暂停状态的整个期间。运行中的游戏和实验模式保留各自的颜色
从第一次调用开始,状态栏中会出现一项,显示 Agent 在做什么:
| 显示 | 含义 |
|---|---|
| Agent 正在编辑:… | 某次调用正在修改所示的页面或场景 |
| Agent 刚刚编辑:… | 最近一次修改,在落地后显示几秒 |
| Agent:… | 两次调用之间,显示已连接的客户端 |
| Agent 已暂停 | 在继续之前,所有修改都会被拒绝 |
点击该项可选择 暂停 Agent 和 跟随 Agent 的编辑
Agent 日志
智能体 → Agent 日志 在底部停靠区、控制台旁边打开一个面板。每次调用占一行:时间、客户端、做了什么、作用对象、结果和耗时
- 筛选可选 全部、只看修改 或 只看失败
- 点击有修改的行,会打开该修改并标出位置
- 被拒绝的行展开后显示原因,以及给 Agent 的 建议
- 导出… 把日志保存为 JSON Lines;清除 清空日志
日志在内存中保存本窗口最近 500 次调用。它记录作者本可以看到的过程,不记录每次调用的参数,也不写入项目
介入
暂停:在状态栏该项或智能体菜单中选择 暂停 Agent,在选择 继续 Agent 之前,Agent 对本项目的所有修改都会被拒绝。Agent 仍然可以读取,以此了解作者在此期间改了什么。暂停只在本次会话中有效,Studio 重启后不保留
撤销:每次修改项目的调用记为一步撤销,包括一次角色编辑,以及一整批译文或配音链接。Ctrl+Z(macOS 上为 Cmd+Z)撤销 Agent 的最近一次修改,与撤销作者自己的修改相同。Skill 要求 Agent 把被撤销的修改视为否决,再次尝试前先询问作者
同时编辑:作者可以编辑 Agent 正在处理的页面或场景。Agent 的下一次写入带着它读取时的版本号,因此会以 stale_revision 被拒绝;Agent 会重新读取作者的版本,在其基础上重做修改,以作者的修改为准
完全停止:关闭 允许 Agent 修改工程,以及已开启的 完全访问 后,所有 Agent 的所有修改都会被拒绝,直到重新打开其中之一;关闭 允许 Agent 连接 则停止端点
通常留给作者的事项
Agent 会在报告中列出这些事项,常见的有:
- 背景不透明的立绘,在提供抠图之前显示为矩形
- 代替未提供美术素材的占位图
- Studio 无法播放的格式,需要转换
- 标记为 机翻、等待作者审校的译文,以及等待审听的配音
- 仍缺少的录音,按场景和预期文件名列出
- Live2D 和 Spine 角色,由作者在角色编辑器中设置
- 残留的示例内容
- 应用图标和代码签名,在构建窗口的标识与签名中设置,见运行与打包