☰
Godot AI多编辑器并行开发:会话路由与session_id定向控制完全教程
2026/10/2 21:12:27 网站建设 项目流程

Godot AI多编辑器并行开发:会话路由与session_id定向控制完全教程

【免费下载链接】godot-aiProduction-grade MCP server and AI tools for the Godot engine. A Snap to install. Totally free and fun.项目地址: https://gitcode.com/gh_mirrors/go/godot-ai

Godot AI是一款面向 Godot 引擎的生产级MCP 服务器与 AI 工具集,能让 Claude Code、Cursor、VS Code 等 AI 客户端直接操控"正在运行"的 Godot 编辑器:建场景、改节点、写脚本、连信号,全部由 AI 完成。当你同时开着多个 Godot 编辑器(多个项目、多个 worktree)时,如何用会话路由和session_id让 AI 的命令精准落到目标编辑器,就是本篇要讲的核心——多编辑器并行开发的完全教程。

一、为什么需要多编辑器并行开发?

日常开发中,你经常会同时打开多个 Godot 编辑器窗口:

  • 一个开主项目,一个开演示项目;
  • 用 git worktree 做并行插件开发,每个工作树一个编辑器;
  • 或者单纯想让 AI 同时盯着两个项目做A/B 对比。

好消息是:Godot AI 的架构天然支持这一点。所有编辑器插件都连接到同一个 MCP 服务器(本地 8000 端口),服务器内部维护一张"会话表",每个编辑器各占一行、互不干扰。也就是说,一个 MCP 服务器,N 个 Godot 编辑器,无需为每个编辑器单独起一套服务。

二、会话路由是如何工作的:一张表 + 一个"活动指针"

理解了实现原理,用起来就不慌。核心逻辑在 src/godot_ai/sessions/registry.py:

  1. 每个编辑器 = 一个会话(Session)。编辑器插件通过 WebSocket 连上服务器后,会注册一个唯一session_id,格式为项目名@16位十六进制,例如my_game@7f9c3a10d8e426b1。
  2. 每个会话带完整快照:Godot 版本、项目路径、当前场景、播放状态、就绪状态(readiness)、连接时间等,见 Session 数据类。
  3. 服务器同时维护一个"活动会话"指针。没有指定目标时,所有命令默认发给这个活动会话。

两个自动行为值得记住:

  • 先连上的编辑器自动成为活动会话,无需手动设置;
  • 活动会话断开时自动"补位":如果只剩一个编辑器还连着,服务器会自动把它提升为活动会话(见 自动提升逻辑),你甚至不会察觉。

💡 简单说:只有一个编辑器时你什么都不用做;一旦开第二个,就需要用下面的方法"点名"了。

三、session_id定向控制:三步上手

1️⃣ 先列出所有会话:看看谁连着

调用session_manage(op="list")(或读取godot://sessions资源,详见 docs/TOOLS.md),返回每个编辑器的:session_id、短名称(项目文件夹名)、project_path、当前场景、is_active标记等。

这是所有路由操作的起点——先知道"桌上有几副牌"。

2️⃣ 一键锁定:session_activate 定向切换

session_activate是核心工具,作用是把后续所有调用固定到指定编辑器。它接受的session_id参数有两种写法(实现在 src/godot_ai/handlers/session.py):

写法示例特点
精确 IDmy_game@7f9c3a10d8e426b1永远优先命中,最稳妥
子串提示my_game匹配短名称、项目路径或 ID;必须唯一命中,命中多个会返回错误并列出所有候选,让你补充更精确的子串

所以日常用起来非常简单:对 AI 说一句"激活 test_project 那个编辑器",AI 就会调用session_activate(session_id="test_project")完成切换,之后的建场景、改脚本等操作全部落在该项目上。

3️⃣ 单次点名:逐调用的 session_id 免切换

如果你只是偶尔要在另一台编辑器上执行一条命令,不想动活动会话,可以用逐调用路由:

所有<domain>_manage聚合工具都接受一个顶层session_id参数(与op、params平级,不要嵌进params里),例如:

  • project_manage(op="stop", session_id="demo_game@7f9c3a10…")→ 只停掉那一个编辑器的游戏
  • editor_manage(op="state", session_id="main@…")→ 只查那一个编辑器的状态

这条规则在 docs/TOOLS.md 中有明确约定。逐调用session_id适合"巡检"式操作,而session_activate适合"整段工作在哪个编辑器上做"的长流程。

四、实战场景:两个最常见用法

场景 A:worktree 并行开发(官方推荐姿势)

Godot AI 官方文档 docs/worktrees.md 明确支持这种玩法:多个 Godot 编辑器(每个 worktree 一个)全部连到同一个 8000 端口的 MCP 服务器,然后用session_activate或逐调用session_id路由命令。

相比"杀掉另一个编辑器的进程"或"把代码 rsync 过去",多开编辑器 + 会话路由是官方文档里推荐的做法——互不干扰,随时切换。

场景 B:AI 双开巡检

让 AI"依次检查两个项目的编辑器状态":对每个会话各发一次带session_id的editor_manage(op="state"),再汇总readiness、play_state、新增错误计数。因为快照按会话独立维护(错误水印、场景变更都是 per-session 的,见 record_readiness),两个项目的日志和错误绝不会串台。

五、常见问题与排查(FAQ)

❓ 提示词匹配到多个会话怎么办?session_activate会返回status: "error"并附上全部候选(session_id+name+project_path)。把子串写得更具体(比如带上一级目录名),或直接粘贴完整 ID。

❓ 某台编辑器关掉后,命令会报错吗?不会乱发。活动会话断开时会自动补位到唯一幸存者;若中途断开的正是目标会话,正在飞行的请求会收到明确的EDITOR_DISCONNECTED错误(断开即失败所有在途请求),而不是静默落到别的编辑器上——这是防止"命令串台"的关键设计。

❓ 两个编辑器同名项目,子串会冲突吗?会。此时必须用完整session_id(@后面的十六进制部分保证了唯一性)。

❓ 命令默认发给谁?发给活动会话。记住这条默认规则,就不会奇怪"为什么 AI 改到了另一个项目"——那是它正钉在另一个会话上,session_activate一下即可。

六、延伸阅读与源码导航

想了解去哪看
全部 46 个工具与session_id约定docs/TOOLS.md
多编辑器 / worktree 并行开发规范docs/worktrees.md
会话表实现(注册、路由、自动补位)src/godot_ai/sessions/registry.py
激活逻辑(精确 ID 优先 + 子串唯一命中)src/godot_ai/handlers/session.py
MCP 工具注册(session_activate / session_manage)src/godot_ai/tools/session.py
运行时会话绑定(防止并发期间指针漂移)src/godot_ai/runtime/direct.py

掌握"先 list、再 activate、必要时逐调用点名"这套组合拳,你就能在同一台机器上放心地多开 Godot 编辑器,让 AI 在同一座 MCP 服务器里游刃有余地穿梭——多编辑器并行开发,从此不串台。🚀

【免费下载链接】godot-aiProduction-grade MCP server and AI tools for the Godot engine. A Snap to install. Totally free and fun.项目地址: https://gitcode.com/gh_mirrors/go/godot-ai

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询