MCP for Unity 原理详解:AI 是如何操控 Unity 编辑器的?
本文从小白视角出发,详细讲解 MCP(Model Context Protocol)与 Unity 编辑器的通信原理、架构设计,以及为什么需要中间层。
一、什么是 MCP?
MCP(Model Context Protocol,模型上下文协议)是 Anthropic(Claude 的母公司)在 2024 年底发布的开放标准协议。它定义了 AI 模型如何发现和调用外部工具的标准方式。
简单来说,MCP 就像是 AI 世界的"USB 接口"------任何工具只要实现了 MCP 协议,就能被 AI 助手(Claude、Cursor、VS Code Copilot 等)直接使用。
截至 2026 年,MCP 已经成为 AI 工具集成的事实标准:
- 10,000+ 个 MCP Server 存在于各个领域
- 主流 IDE 全面支持:Cursor、VS Code Copilot、Claude Desktop/Code
- 主要厂商已采纳:Anthropic、OpenAI、Google、Microsoft
二、MCP for Unity 是什么?
MCP for Unity 是一个社区开发的开源项目,它让 AI 助手(如 Cursor 中的 Claude)能够直接与运行中的 Unity 编辑器进行双向通信------查询场景、创建 GameObject、管理资源、执行 C# 代码等。
注意:这不是 Unity 官方产品。Unity Technologies 目前没有提供自己的 MCP 实现。所有 Unity MCP 方案都是第三方社区开发的。
目前最流行的方案是 CoplayDev/unity-mcp(8,000+ GitHub Stars,MIT 许可证)。
三、整体架构
MCP for Unity 的架构可以概括为三层:
┌─────────────┐ MCP 协议 ┌──────────────────┐ HTTP/Bridge ┌────────────────┐
│ Cursor IDE │ ◄─────────────► │ MCP Server 进程 │ ◄──────────────► │ Unity Editor │
│ (AI Agent) │ JSON-RPC │ (协议处理层) │ │ (C# 插件端) │
└─────────────┘ └──────────────────┘ └────────────────┘
三层各自的职责
| 层 | 说明 |
|---|---|
| Cursor IDE(AI 客户端) | AI 模型产生意图("我要创建一个 GameObject"),通过 MCP 协议发送请求 |
| MCP Server(协议处理层) | 处理 MCP 协议的序列化、工具注册、参数校验,将请求转发给 Unity |
| Unity Editor(执行层) | 在编辑器进程内执行实际的 Unity API 调用,返回结果 |
四、通信流程详解
第一步:Unity 侧启动 HTTP 服务
Unity Editor 打开项目后,MCP 插件以编辑器扩展的形式自动加载,在 Unity 进程内部启动一个 HTTP 服务器(默认监听 localhost:8080)。
csharp
// 插件利用 .NET 自带的 HttpListener 搭建 HTTP 服务器
var listener = new HttpListener();
listener.Prefixes.Add("http://127.0.0.1:8080/");
listener.Start();
// 开始监听外部请求...
重点 :Unity 官方本身不提供 HTTP 服务器功能。插件利用的是 .NET 标准库(
System.Net.HttpListener)自己搭建的。Unity 提供的是 C# 运行时环境和编辑器扩展机制。
第二步:建立 Bridge 会话
HTTP 服务就绪后,通过 Bridge 组件建立持久连接,确保 MCP Server 和 Unity 之间的通信稳定。
第三步:AI 通过 MCP 协议调用
当 AI 需要操作 Unity 时,完整的调用链路如下:
AI 模型产生意图 MCP 协议传输 Unity 内部执行
───────────── ───────────── ─────────────
AI: "创建一个名 Cursor → MCP Server: Unity C# 插件:
为 Player 的 { var go = new
GameObject" "tool": "manage_ GameObject("Player");
gameobject",
"args": {
"action": "create",
"name": "Player"
}
}
│
▼
HTTP 请求发送到
Unity 内嵌的
HTTP 服务器
五、核心问题:为什么不能直接调用 Unity 接口?
这是很多人的疑问:既然最终还是调用 Unity API,为什么要绕这么大一圈?为什么 Cursor 不直接调用 Unity 的编辑器接口?
原因一:两个独立进程,语言不通
Cursor 是一个 Electron 应用(JavaScript/TypeScript 运行时),Unity Editor 是一个 C# 应用(Mono/.NET 运行时)。它们是操作系统上完全独立的两个进程。
- Cursor 不能
import UnityEditor,因为那是 C# 的东西 - Unity 不能直接接收 Cursor 的调用,因为它没有暴露任何外部接口
就好比你和一个只说法语的人对话------你需要一个翻译。
原因二:Unity API 是进程内 API
Unity 的 API(AssetDatabase、EditorSceneManager、GameObject 等)全部是进程内 API,只能在 Unity 自己的 C# 进程里调用。它不像 Web 服务那样天生监听端口等着外部请求。
csharp
// 这些 API 只能在 Unity 进程内部调用,外部进程完全无法触及
AssetDatabase.FindAssets("t:Prefab"); // ❌ 外部进程无法调用
EditorSceneManager.OpenScene("xxx.unity"); // ❌ 外部进程无法调用
GameObject.Find("Player"); // ❌ 外部进程无法调用
原因三:AI 需要标准化的工具发现机制
即使你让 Unity 暴露了 HTTP 接口,AI 模型也需要一种标准化的方式来:
- 知道有哪些工具可以用
- 知道每个工具的参数格式
- 知道返回值是什么结构
MCP 协议就是解决这个问题的标准。
类比理解
这就像问"为什么浏览器不能直接操作数据库,非要通过后端服务器?"
浏览器 (前端) ←→ 后端服务器 (API) ←→ 数据库
↕ ↕ ↕
Cursor (AI) ←→ MCP Server ←→ Unity Editor
浏览器不能直接连 MySQL,因为语言不通、安全性、协议不同。Cursor 不能直接调 Unity API,原因完全一样。
六、MCP 操作 Unity 的方式:API 调用,不是界面模拟
MCP for Unity 是通过 Unity 的编程接口(API)操作的,不是模拟界面点击。
高层封装工具
MCP 插件把 Unity API 封装成了一系列工具,AI 调用这些工具时,插件内部执行的是对应的 C# API:
| MCP 工具 | 内部调用的 Unity API |
|---|---|
manage_gameobject(action="create") |
new GameObject() |
manage_components(action="add") |
gameObject.AddComponent<T>() |
manage_scene(action="load") |
EditorSceneManager.OpenScene() |
manage_asset(action="search") |
AssetDatabase.FindAssets() |
manage_editor(action="play") |
EditorApplication.isPlaying = true |
manage_prefabs(action="create") |
PrefabUtility.SaveAsPrefabAsset() |
read_console(action="get") |
读取 Unity Console 内部日志 |
任意代码执行
execute_code 工具甚至可以在 Unity Editor 内动态编译并执行任意 C# 代码:
csharp
// AI 发送的代码会在 Unity 进程内编译并执行
var allCameras = Camera.allCameras;
return $"场景中有 {allCameras.Length} 个摄像机";
操作结果自动反映到 UI
虽然操作方式是 API 调用,但结果会立即反映到 Unity 编辑器界面上。比如通过 API 创建了一个 GameObject,Hierarchy 窗口会立刻显示它。
七、MCP 提供的能力概览
工具(Tools)--- 执行操作
MCP for Unity 提供了 44 个工具,涵盖 Unity 编辑器的方方面面:
| 类别 | 工具 | 功能 |
|---|---|---|
| 场景管理 | manage_scene |
创建/加载/保存场景、查询层级 |
| 对象操作 | manage_gameobject |
创建/修改/删除/复制 GameObject |
| 组件管理 | manage_components |
添加/删除组件、设置属性 |
| 资源管理 | manage_asset |
搜索/创建/删除资源 |
| 编辑器控制 | manage_editor |
Play/Pause/Stop、Undo/Redo |
| 预制体 | manage_prefabs |
创建/实例化/编辑预制体 |
| 脚本管理 | manage_script |
创建/修改 C# 脚本 |
| 代码执行 | execute_code |
在 Unity 中执行任意 C# 代码 |
| 控制台 | read_console |
读取/清除 Console 日志 |
| 构建 | manage_build |
构建项目 |
| UI | manage_ui |
UI 元素操作 |
| 材质/着色器 | manage_material / manage_shader |
材质和着色器管理 |
| 物理 | manage_physics |
物理系统配置 |
| 图形 | manage_graphics |
渲染和图形设置 |
资源(Resources)--- 只读查询
MCP 还提供了 19 个只读资源,用于查询编辑器状态:
| 资源 | 用途 |
|---|---|
editor_state |
编辑器就绪状态、是否正在编译 |
project_info |
项目信息(Unity 版本、渲染管线等) |
editor_selection |
当前选中的对象 |
custom_tools |
项目自定义工具列表 |
unity_instances |
运行中的 Unity 实例 |
menu_items |
可用的菜单项 |
八、自定义工具扩展
MCP for Unity 支持在项目中注册自定义工具。通过 [McpForUnityTool] 特性,你可以把项目特有的编辑器操作暴露给 AI:
csharp
[McpForUnityTool(
"yoo_list_groups",
Description = "列出 YooAsset 收集器中所有 Group 的概况信息"
)]
public static class YooListGroups
{
public class Parameters
{
[ToolParameter("包裹名称", Required = false)]
public string package_name { get; set; }
}
public static object HandleCommand(JObject @params)
{
// 实现自定义逻辑...
}
}
这意味着你可以根据项目需要,让 AI 拥有操控项目专有工具(如资源管理系统、构建流水线等)的能力。
九、独立服务能否替代 Unity 插件?
不能完全替代。
Unity 的 API 只存在于 Unity 进程的内存空间中,外部独立服务无法直接调用:
┌──────────────────────────────────┐
│ Unity Editor 进程 │
│ │
│ 内存中存活的对象: │
│ ├── Scene Graph(场景树) │
│ ├── AssetDatabase(资源数据库) │
│ ├── 所有 GameObject 实例 │
│ └── Console 日志 │
│ │
│ → 这些东西外部进程看不到、摸不到 │
└──────────────────────────────────┘
如果写一个完全脱离 Unity 的独立服务,你只能操作磁盘上的文件(.cs 脚本、.prefab、.unity 场景文件等),但无法执行任何运行时操作。
结论:无论怎么拆分架构,Unity 进程内至少需要一个"最小代理插件"来暴露 API。这个代理可以很薄(只转发 HTTP 请求),但不能没有。
十、MCP 服务的启动方式
MCP 服务必须依赖 Unity 编辑器运行,但启动方式比较灵活:
| 启动方式 | 适用场景 |
|---|---|
| 自动启动 | Unity 打开项目后插件自动启动 HTTP 服务(最常用) |
| 手动菜单 | 在 Unity 菜单 Tools → MCP Service → 启动服务+会话 |
| 命令行 | Unity.exe -executeMethod McpServiceCli.StartAll(CI/自动化) |
实际使用流程:先打开 Unity 编辑器 → MCP 服务自动就绪 → Cursor 即可通过 MCP 与 Unity 通信。
十一、市面上的 Unity MCP 方案对比
| 方案 | Stars | 工具数量 | 特点 | 许可证 |
|---|---|---|---|---|
| CoplayDev/unity-mcp | 8,100+ | ~44 工具 | 社区最大、支持自定义扩展 | MIT |
| AnkleBreaker Studio | 160+ | 288 工具 | 覆盖面最广 | 开源 |
| IvanMurzak/Unity-MCP | 2,100+ | 60+ 工具 | 多传输协议、Docker 支持 | Apache 2.0 |
| Abbabon/unity-mcp-sharp | - | 28 工具 | C# 原生 MCP SDK 实现 | 开源 |
十二、总结
MCP for Unity 的本质是:
- 在 Unity 进程内嵌入 HTTP 服务器(利用 .NET 标准库)
- 通过 HTTP 桥接实现跨进程通信(从 Node.js 世界到 C# 世界)
- 通过 MCP 协议标准化工具接口(让 AI 能自动发现和调用工具)
它让 AI 助手拥有了和开发者一样操控 Unity 编辑器的能力:查询场景层级、管理 GameObject、执行 C# 代码、读取 Console 日志、管理资源------所有操作都是通过 Unity 的编程 API 完成的,而不是模拟界面点击。
如果这篇文章对你有帮助,欢迎点赞收藏。如有疑问,欢迎评论区交流。