<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>游戏开发 - Tag - SaiyuDoc</title><link>https://www.wangsaiyu.com/tags/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/</link><description>游戏开发 - Tag - SaiyuDoc</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>panicwang@outlook.com (王赛宇)</managingEditor><webMaster>panicwang@outlook.com (王赛宇)</webMaster><lastBuildDate>Mon, 21 Sep 2026 07:56:40 +0000</lastBuildDate><atom:link href="https://www.wangsaiyu.com/tags/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/" rel="self" type="application/rss+xml"/><item><title>游戏 Agent 演进之道</title><link>https://www.wangsaiyu.com/posts/ai/game-agent-evolution/</link><pubDate>Mon, 21 Sep 2026 07:56:40 +0000</pubDate><author>王赛宇</author><guid>https://www.wangsaiyu.com/posts/ai/game-agent-evolution/</guid><description><![CDATA[<p>游戏 Agent 的目标是把用户需求转换成一个可以运行的游戏。这个过程包含需求分析、素材生成、代码修改、测试和发布，需要模型与业务系统共同完成。</p>
<p>本文记录我们在实现这条链路时做过的几次调整，依次介绍 Prompt、多 Agent 分工、Skills、工具接口和任务恢复。每一部分说明原来的实现、遇到的问题，以及后续采用的处理方式。原生引擎的接入状态以本文最初整理时为准。</p>
<h2 id="1-通过-prompt-组织开发流程">1. 通过 Prompt 组织开发流程</h2>
<h3 id="11-初始实现">1.1. 初始实现</h3>
<p>第一版使用 Python 实现。我们在一份较长的 Prompt 中描述游戏开发过程，包括理解需求、整理策划、准备素材、制作地图、编写玩法、测试和部署。</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/01-overview.svg" title="初始游戏 Agent 按 Prompt 组织开发过程" data-thumbnail="/images/game-agent-evolution/01-overview.svg" data-sub-html="<h2>图 1：初始游戏开发流程</h2>">
        
    </a><figcaption class="image-caption">图 1：初始游戏开发流程</figcaption>
    </figure>
<p>Prompt 同时提供工程约定：使用什么技术栈，地图采用什么格式，素材怎样加载，最后需要交付什么。模型根据这些信息调用工具，把每一步的结果交给后续步骤。</p>
<p>这套实现的主要作用，是把业务知识和开发步骤放到一个明确的位置，使整条链路能够开始运行。后续增加的规则，则需要区分它究竟在解决哪一类问题。</p>
<h3 id="12-规则对应的问题">1.2. 规则对应的问题</h3>
<p>例如，模型不知道地图文件的格式，可以补充格式说明；模型启动命令后拿不到剩余输出，需要补充命令会话接口；素材已经生成，恢复任务时却找不到，需要保存素材任务与结果的关联。</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/13-problem-types.svg" title="知识、执行接口和业务记录分别对应不同的处理方式" data-thumbnail="/images/game-agent-evolution/13-problem-types.svg" data-sub-html="<h2>图 2：不同问题对应的修改位置</h2>">
        
    </a><figcaption class="image-caption">图 2：不同问题对应的修改位置</figcaption>
    </figure>
<p>这三类问题都可能表现为“游戏没有完成”，但修改位置不同。只有第一类可以直接通过补充知识解决。工具或业务状态没有接好时，增加文字提醒仍然缺少实际的执行依据。</p>
<p>因此，Prompt 中的内容需要能够追溯到具体问题。项目约定和素材能力属于持续需要的业务信息；为了绕开某个模型弱点而加入的固定步骤，则需要在模型更新后重新验证。</p>
<h2 id="2-多-agent-分工">2. 多 Agent 分工</h2>
<h3 id="21-角色划分">2.1. 角色划分</h3>
<p>游戏任务变复杂后，我们开始按照能力拆分 Agent：主 Agent 组织任务，开发 Agent 修改代码，配置 Agent 处理地图和音频，素材相关 Agent 生成资源。角色、动画、封面等工作也有各自的入口。</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/04-specialist-agents.svg" title="主 Agent 与开发、配置和素材 Agent 的调用关系" data-thumbnail="/images/game-agent-evolution/04-specialist-agents.svg" data-sub-html="<h2>图 3：按专业能力划分 Agent</h2>">
        
    </a><figcaption class="image-caption">图 3：按专业能力划分 Agent</figcaption>
    </figure>
<p>每个 Agent 有自己的 Prompt 和工具集合，能够单独调整。适合独立完成的素材任务，也可以并行执行。</p>
<p>但子 Agent 拥有自己的执行过程，主 Agent 已经知道的信息，需要通过输入显式传过去。任务完成后，结果还要传回主 Agent，才能继续后续工作。</p>
<h3 id="22-上下文交接">2.2. 上下文交接</h3>
<p>以“给角色增加二段跳”为例，开发 Agent 需要读取角色移动代码、跳跃状态、动画和音效的使用方式。如果用户同时要求“保持原来的移动手感”，这条限制也要进入子任务输入。</p>
<p>一次交接至少涉及：</p>
<ul>
<li>本次需要完成的修改；</li>
<li>必须保留的行为和用户限制；</li>
<li>使用哪个工程与工作区；</li>
<li>已经完成的相关工作；</li>
<li>返回什么结果，后续由谁接着处理。</li>
</ul>
<figure><a class="lightgallery" href="/images/game-agent-evolution/05-agent-handoff.svg" title="主 Agent 通过开发工具包装器启动子 Runner，并接收执行结果" data-thumbnail="/images/game-agent-evolution/05-agent-handoff.svg" data-sub-html="<h2>图 4：开发子任务的执行与结果返回</h2>">
        
    </a><figcaption class="image-caption">图 4：开发子任务的执行与结果返回</figcaption>
    </figure>
<p>我们后来还去掉过主 Agent 的 Bash 入口，把编码进一步交给开发 Agent。这样工具权限更加集中，但主 Agent 需要通过子任务才能检查工程或完成一次小修改。</p>
<p>代码、地图配置和素材接入虽然属于不同专业，却经常共同完成同一个需求。拆开以后，各个 Agent 都需要重新理解相关部分，主 Agent 再整合局部结果。交接遗漏约束、结果不足以判断是否完成，都是需要处理的问题。</p>
<p>因此，角色名称只能说明知识分工，还不足以确定执行边界。是否能够并行、是否需要隔离权限、结果是否容易交接，都需要结合实际任务判断。</p>
<h2 id="3-主-agent-与-skills">3. 主 Agent 与 Skills</h2>
<p>第二版将编码能力放回主 Agent，同时通过 Skills 按需提供专业方法。</p>
<p>这里的 Skill 是完成某类工作需要的方法、说明和辅助资源。加载 Skill 后，相关知识进入当前工作上下文；启动子 Agent 则会建立一段独立执行。两者有不同的用途。</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/06-skills.svg" title="主 Agent 在同一工程中执行，按需读取专业知识与工具说明" data-thumbnail="/images/game-agent-evolution/06-skills.svg" data-sub-html="<h2>图 5：通过 Skills 提供专业知识</h2>">
        
    </a><figcaption class="image-caption">图 5：通过 Skills 提供专业知识</figcaption>
    </figure>
<p>处理地图时加载地图格式与操作方法，接入素材时加载对应的资源使用说明。仍然由主 Agent 理解需求、读取工程、修改文件，再检查修改结果。</p>
<p>这样，配置修改和代码修改可以在同一上下文里连续完成。用户刚确认的限制也保留在原会话中，减少了重复组织子任务输入的工作。</p>
<p>独立素材生产、封面制作等任务仍然保留自己的执行入口。这类工作有相对明确的输入和输出，外部执行结束后，可以通过任务编号与产物引用交回主流程。</p>
<p>调整后的分工可以归纳为：专业知识通过 Skill 提供，需要独立权限、生命周期或并行执行的工作，再使用独立任务。这一划分仍然要通过任务完成情况验证。</p>
<h2 id="4-工具接口与模型上下文">4. 工具接口与模型上下文</h2>
<h3 id="41-工具集的适配">4.1. 工具集的适配</h3>
<p>模型接入后，需要同时提供它能够使用的工具。工具的名称、参数、执行行为和结果格式，共同组成调用协议。</p>
<p>我们逐步对齐了 Codex 和 Claude Code 两类基础工具，并按所选模型装配相应工具集。</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/07-toolsets.svg" title="自研 Runtime 为不同模型装配相应的文件和命令工具" data-thumbnail="/images/game-agent-evolution/07-toolsets.svg" data-sub-html="<h2>图 6：自研 Runtime 中的工具适配</h2>">
        
    </a><figcaption class="image-caption">图 6：自研 Runtime 中的工具适配</figcaption>
    </figure>
<p>这里仍由自研 Runtime 组织模型循环。采用 Codex 风格的工具接口，并不表示已经由原生 Codex 执行任务。</p>
<p>以命令工具为例，启动测试以后可能出现三种结果：</p>
<ol>
<li>命令已结束，返回输出与退出码；</li>
<li>命令仍在运行，返回执行会话编号，之后继续读取输出；</li>
<li>执行出错，返回能够定位原因的信息。</li>
</ol>
<p>后续还需要通过原会话发送输入、中断命令，以及在 Runtime 重启后重新查询。若命令仍在运行，工具却只返回一段文本，模型就无法判断是等待、重试还是继续修改。</p>
<p>文件工具也一样。读取范围、补丁格式和修改失败的反馈，需要与实际工作方式对应。对齐工具名称之后，还需要逐项检查这些行为。</p>
<h3 id="42-上下文组织">4.2. 上下文组织</h3>
<p>每次模型请求包含本轮指令、工具定义、历史消息，以及新的工具结果。运行时间增长后，需要压缩较早的历史，并保留后续执行所需的信息。</p>
<p>模型切换时，还要重新核对推理参数、工具调用与结果的对应关系，以及缓存条件。例如，把已有历史作为稳定前缀继续追加，和每轮重新排列同一批内容，可能有不同的缓存效果；实际命中情况仍以服务端返回的使用信息为准。</p>
<p>这些内容通常归入 Harness，也就是模型外层组织工具、上下文和执行环境的部分。模型能力变化后，Prompt、工具协议和上下文组织需要一起检查，不能只修改模型名称。</p>
<h2 id="5-验证与修复流程">5. 验证与修复流程</h2>
<h3 id="51-固定检查流程">5.1. 固定检查流程</h3>
<p>我们曾增加一套较完整的质量流程，将用户意图、素材、运行证据、检查和发布串起来。对于“玩法保持不变，场景改成雪地”这类需求，流程需要一直保留修改目标与不变条件。</p>
<p>其中还包含固定检查多个视口，以及开始、胜利、失败、重试等场景。检查得到问题后，再触发修复和重新部署。</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/10-quality.svg" title="固定检查与修复循环，以及按需求组织的验证过程" data-thumbnail="/images/game-agent-evolution/10-quality.svg" data-sub-html="<h2>图 7：验证与修复流程的调整</h2>">
        
    </a><figcaption class="image-caption">图 7：验证与修复流程的调整</figcaption>
    </figure>
<p>问题出在检查范围与当前需求不一定一致。用户只要求手机竖屏时，其他方向的检查可能触发额外修改；每次修改又需要重新运行和部署。实际案例中出现过消耗和等待增加，以及围绕检查结果反复修补的情况。这里是个案观察，不据此给出整体效率结论。</p>
<h3 id="52-按任务确定验证范围">5.2. 按任务确定验证范围</h3>
<p>调整后，我们把素材使用、工程接入和预算安排提前到部署前处理。验证仍然保留，但检查范围根据当前需求确定，修复也结合问题影响与剩余预算决定。</p>
<p>以手机竖屏游戏为例，本轮优先检查竖屏的核心游玩路径。其他视口的问题可以记录，但是否必须在本轮修复，需要根据交付范围判断。</p>
<p>这样调整之后，需要保留的记录包括：本轮验收条件、执行过的检查、检查结果，以及决定继续修改或结束的依据。减少固定步骤之后，仍然能够说明最终交付经过了哪些验证。</p>
<h2 id="6-异步任务与恢复">6. 异步任务与恢复</h2>
<h3 id="61-几种不同的执行状态">6.1. 几种不同的执行状态</h3>
<p>游戏能力接入 Go 后端以后，会话、执行记录和费用由运行时及业务服务管理。一次游戏生成又包含多个异步过程，不能用单一状态概括。</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/08-progress.svg" title="模型运行、素材生成、版本发布与客户端接收具有独立进度" data-thumbnail="/images/game-agent-evolution/08-progress.svg" data-sub-html="<h2>图 8：一次游戏生成中的不同进度，横向长度不表示实际耗时</h2>">
        
    </a><figcaption class="image-caption">图 8：一次游戏生成中的不同进度，横向长度不表示实际耗时</figcaption>
    </figure>
<p>模型结束一轮输出时，素材可能仍在生成。素材完成以后，需要接入工程；游戏发布完成以后，客户端还需要收到版本信息。系统应当保存这些状态及其所属任务，再组合成用户看到的进度。</p>
<p>否则，模型的一次结束可能被误用为整个任务成功，外部任务已经完成也可能因为消息丢失而一直显示等待。</p>
<h3 id="62-恢复记录">6.2. 恢复记录</h3>
<p>恢复一项工作时，需要读取它所对应的持久记录。</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/09-recovery.svg" title="上下文、异步任务、事件与用户轮次的恢复记录" data-thumbnail="/images/game-agent-evolution/09-recovery.svg" data-sub-html="<h2>图 9：任务恢复所使用的记录</h2>">
        
    </a><figcaption class="image-caption">图 9：任务恢复所使用的记录</figcaption>
    </figure>
<p>上下文检查点保存整理过的历史和覆盖位置，用于继续模型执行。素材任务记录保存外部任务编号与产物引用，用于查询原操作。事件 Outbox 保存待发送事件，用于失败后补发。用户轮次与运行记录关联，使恢复的结果仍然属于原来的请求。</p>
<p>素材是否成功、费用是否发生、版本是否创建，由对应业务记录确认。模型摘要可以帮助继续理解任务，但不能作为这些操作已经发生的唯一依据。</p>
<p>事件补发也不应重新执行一次素材生成或发布。接收方按事件编号去重，业务操作则使用自己的任务编号或幂等编号，两者分别处理。</p>
<h2 id="7-原生执行引擎的接入">7. 原生执行引擎的接入</h2>
<p>自研 Runtime 要持续维护模型循环、工具协议和上下文组织。另一种选择是复用原生编码引擎，把业务工具接到已有的执行环境中。</p>
<p>Codex 提供程序化接入方式，Claude Agent SDK 也提供相应的执行能力。<a href="https://learn.chatgpt.com/docs/codex-sdk" target="_blank" rel="noopener noreffer ">Codex SDK</a>、<a href="https://code.claude.com/docs/en/agent-sdk/overview" target="_blank" rel="noopener noreffer ">Claude Agent SDK 文档</a>。</p>
<p>我们在这一阶段开始尝试把原生 Codex 接入新的 Runtime，通过适配层连接现有业务服务。</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/11-runtime-boundary.svg" title="自研执行链与原生引擎方案共用业务服务" data-thumbnail="/images/game-agent-evolution/11-runtime-boundary.svg" data-sub-html="<h2>图 10：自研运行时与原生引擎的职责划分</h2>">
        
    </a><figcaption class="image-caption">图 10：自研运行时与原生引擎的职责划分</figcaption>
    </figure>
<p>引擎负责读取工程、调用基础工具、修改代码和执行验证。平台继续保存项目、会话和运行关系；素材、费用、版本与交付结果仍由业务服务负责。</p>
<p>适配层需要处理事件转换、取消、继续会话，以及产物接入。即使引擎已经在文件系统中生成了一张图片或构建了一份游戏，平台仍需要登记产物、关联项目和版本，才能进入产品的交付流程。</p>
<p>本文最初整理时，原生引擎接入仍在开发验证阶段。部分原生执行和素材任务完成了限定范围的开发环境验收，项目交互、完整交付和恢复仍在推进。这些结果只能说明已验证的范围，不能作为整套迁移完成的依据。</p>
<h2 id="8-模型与流程的对照验证">8. 模型与流程的对照验证</h2>
<p>上面的调整同时涉及模型、Prompt、工具和编排。若把它们一起修改，只能观察到最终结果变化，很难确定是哪一部分起了作用。</p>
<p>后续可以固定一组游戏需求和验收条件，分步骤比较：</p>
<figure><a class="lightgallery" href="/images/game-agent-evolution/12-follow-model.svg" title="固定任务后分别比较模型、执行环境和流程变化" data-thumbnail="/images/game-agent-evolution/12-follow-model.svg" data-sub-html="<h2>图 11：对照验证的组织方法，尚不表示实验已全部完成</h2>">
        
    </a><figcaption class="image-caption">图 11：对照验证的组织方法，尚不表示实验已全部完成</figcaption>
    </figure>
<p>先保存现有模型与流程的结果，再接入兼容的新模型；之后调整工具和上下文；最后每次简化一部分编排。比较旧环境时，应先满足新模型的接口与工具兼容要求。</p>
<p>各组使用相同的记录项：需求完成情况、核心玩法验证、交付版本、总费用、等待时间，以及失败后的恢复结果。把重复素材任务、无效部署和额外修复计入成本，才能判断一次有效交付实际消耗多少资源。</p>
<p>多 Agent、固定检查和独立评估都可以放进这套比较中。某一步删除后，若结果在约定范围内保持稳定，同时费用与等待下降，才有依据继续简化；出现质量下降，则需要检查该步骤在当前任务中承担了什么作用。</p>]]></description></item></channel></rss>