MCP for Unity 自定义工具开发:从同步截图到轮询式长任务
解决的问题与适用场景
原文要解决的是在 Unity 中创建自定义工具,覆盖简单同步操作与能跨域重载的复杂长任务。
工具、版本与前置条件
- MCP for Unity:版本:原文未说明;前置条件:工具代码必须放在 Unity 项目的 Editor 文件夹中,因为系统只扫描 Editor 程序集。。
操作步骤与工作流衔接
1. 创建静态类,添加 [McpForUnityTool] 特性并实现 HandleCommand(JObject) 方法。
- 输入:C# 静态类与 [McpForUnityTool] 特性、HandleCommand(JObject) 方法。
- 输出:系统通过 C# 特性与反射自动发现并注册该工具。
- 后处理与接入:原文未说明
2. 在嵌套 Parameters 类中用 [ToolParameter] 标注参数描述与是否必填。
- 输入:[ToolParameter("Value to process")] 与 [ToolParameter("Optional integer payload", Required = false)]。
- 输出:为 AI 助手提供参数说明,并标明哪些参数必填。
- 后处理与接入:原文未说明
3. 在 MCP 客户端中断开并重新连接 MCP 服务器,强制重新发现工具。
- 输入:已注册的新工具与 MCP 客户端连接。
- 输出:客户端重新发现工具。
- 后处理与接入:若无效,部分客户端(如 Windsurf)需移除并重新配置 MCP for Unity 服务器。
4. 用 CLI 列出当前 Unity 项目的自定义工具,并按名称调用。
- 输入:unity-mcp tool list、unity-mcp custom_tool list,以及 unity-mcp editor custom-tool "my_custom_tool" --params '{"param1":"value"}'。
- 输出:列出工具并执行指定自定义工具。
- 后处理与接入:原文未说明
5. 截图工具用 RenderTexture 渲染相机,读取像素并编码为 PNG 写入文件。
- 输入:filename 必填,width 与 height 可选,默认取 Screen.width 与 Screen.height;输出路径为 Application.dataPath 下的 Screenshots 目录。
- 输出:返回 SuccessResponse,包含截图绝对路径、宽度与高度。
- 后处理与接入:原文未说明
6. 长任务工具设置 RequiresPolling = true 与 PollAction = "status",启动时返回 PendingResponse。
- 输入:[McpForUnityTool(RequiresPolling = true, PollAction = "status")] 与 new PendingResponse("message", pollIntervalSeconds)。
- 输出:工具启动工作并返回 pending 信号。
- 后处理与接入:Python 中间件自动轮询 Unity 直到任务完成,超时时间为 10 分钟。
7. 用 McpJobStateStore 将进度保存到 Library/ 文件夹,并在 Status 方法中返回 _mcp_status。
- 输入:Status 方法检查进度并返回 _mcp_status 的 pending、complete 或 error。
- 输出:域重载清空内存后,工具仍能记住任务状态。
- 后处理与接入:服务器将轮询间隔限制在 0.1 到 5 秒之间。
原作者的结果与限制
- 结果:原文未说明
- 限制与踩坑:轮询超过 10 分钟后服务器放弃并返回超时错误及最后一次响应。
原文与来源
- 作者:原文未说明
- 来源:MCP for Unity open-source implementation guides
- 原文日期:原文未说明
- 阅读原文
本文为基于原文整理的中文导读,效果与结论归属于原作者。