☰
Godot-MCP 代码实现解析:execute_editor_script 如何动态执行任意 GDScript
2026/9/25 2:05:49 网站建设 项目流程

Godot-MCP 代码实现解析:execute_editor_script 如何动态执行任意 GDScript

【免费下载链接】Godot-MCPAn MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP

Godot-MCP 是一个让 Claude 等 AI 助手直接操控 Godot 游戏引擎的 MCP(Model Context Protocol)插件。本文将深入剖析其最强大的工具——execute_editor_script,看它是如何把 AI 生成的任意 GDScript 代码安全地注入 Godot 编辑器并动态执行的。

一、功能定位:为什么需要"任意脚本执行"?

Godot-MCP 内置了创建节点、编辑场景、管理脚本等固定工具,但 Godot 编辑器 API 浩如烟海,不可能每个都做成独立工具。execute_editor_script就是那个"万能逃生舱":只要 AI 会写 GDScript,就能在编辑器上下文中执行它——查节点、改属性、批量操作,统统搞定。

Godot-MCP 动态执行 GDScript 架构

二、命令的完整流转路径 🛤️

一条命令从 AI 到 Godot 编辑器,要经过 4 站:

站点文件职责
MCP 工具定义editor_tools.ts向 Claude 暴露工具,校验参数
WebSocket 客户端godot_connection.ts发送命令并等待响应
编辑器内 WebSocket 服务mcp_server.gd监听 9080 端口,解析命令
命令处理器editor_script_commands.gd真正执行 GDScript

第 1 站:工具注册与参数校验

MCP 服务启动时(index.ts),editorTools被注册进 FastMCP。工具本身非常简洁——只有一个code参数,用 zod 校验为非空字符串后,直接调用godot.sendCommand('execute_editor_script', { code })。

第 2 站:Promise 化的 WebSocket 通信

GodotConnection.sendCommand 生成递增的commandId,把{type, params, commandId}序列化为 JSON 发出,同时在内部队列里挂起一个 Promise——等 Godot 带着相同commandId的响应回来时自动 resolve。这样异步的 WebSocket 就变成了好用的await接口。

第 3 站:Godot 编辑器内的路由

Godot 侧的 mcp_server.gd 在_process中轮询连接与消息。收到带type字段的旧版命令格式后,通过command_received信号交给命令处理器。command_handler.gd 依次询问各处理器,谁认领谁处理;execute_editor_script最终被MCPEditorScriptCommands接走。

三、核心实现:动态脚本的"三明治"结构 🥪

真正的高光代码在 editor_script_commands.gd。它的思路是:把用户代码"夹"进一个预先写好的 GDScript 模板里,生成临时脚本节点执行。

@tool extends Node signal execution_completed var result = null var _output_array = [] func custom_print(values): ... # 自定义输出收集器 func run(): # USER CODE START {user_code} # ← AI 写的代码注入这里 # USER CODE END execution_completed.emit()

流程分 5 步:

  1. 校验:code为空直接返回错误(L16-L17)
  2. 改写 print:用正则print\s*\(([^)]+)\)把所有print(...)替换成custom_print([...])(L159-L181)。这样输出不再只进控制台,而是被收集进_output_array,能随响应返回给 AI——注意替换是倒序进行的,避免字符串长度变化导致位置错乱
  3. 缩进归一化:把用户代码行首的空格按每 4 个换算成 1 个 Tab,整体再统一缩进一级(L85-L111),规避 GDScript 经典的"Tab/空格混用"解析错误
  4. 预检解析:执行前调用script.reload(),解析失败立即报错,不污染编辑器(L117-L121)
  5. 信号驱动收尾:给临时节点挂上execution_completed信号,run()跑完后由 信号回调 收集result、output、错误信息,拆除临时节点,再通过 _send_success 把{success, output, result/error}发回 WebSocket

这套"信号 + 临时节点 + 用完即毁"的设计,保证脚本执行不阻塞编辑器主循环,也天然隔离了状态污染。

四、设计亮点与工程细节

  • 输出捕获:AI 的"眼睛"全靠print。改写为custom_print后,AI 能看见自己脚本跑出了什么,形成"生成 → 执行 → 观察 → 修正"的闭环
  • 错误不崩溃:解析错误走_send_error返回结构化错误消息,编辑器本身纹丝不动
  • 命令模式:所有工具都是"类型 + 参数 + ID"的 JSON 对象,新增能力只需注册新的处理器,扩展性极佳(见 architecture.md 中的设计模式说明)
  • 本地通信:WebSocket 默认只监听 localhost:9080,配合commandId匹配与 20 秒超时,兼顾安全与可靠

五、写在最后

execute_editor_script展示了 MCP 工具的一个精髓:与其列举 100 个固定操作,不如开放一个受控的执行通道。它用模板注入、正则改写、缩进归一化和信号回调四个朴素技术,就把"AI 自由编程"这件高风险的事做成了稳定、可观测、自动清理的工程化流程。如果你想给 Godot-MCP 加新命令,照着 editor_script_commands.gd 抄一遍再改参数,就是最快的上手路径。🎮

【免费下载链接】Godot-MCPAn MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP

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

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

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

立即咨询