前阵子终于把一个憋了很久的想法跑通了:让AI不仅能给我写C#脚本,还能直接在我的Unity编辑器里新建对象、改组件参数、按播放键、截图,然后全程汇报给我。这件事落地之后就靠一个叫Unity-MCP的工具组合。我花了两个晚上从零搭起来,整个过程踩了不少坑,也彻底弄明白了MCP协议在游戏开发这个场景下到底能玩出什么花。如果你也受够了"让AI写代码再自己贴进Unity"这种半自动流程,这篇文章值得你花十分钟看完。
需要说明的是,Unity-MCP并不是某个官方插件的名称,而是"Unity编辑器 + MCP Server"这一整套方案的统称。核心思路是给Unity编辑器装一个可以被AI调用的“工具接口层”,让AI大模型能直接获取场景层级、操作GameObject、执行菜单命令、读取Console日志。简单说,它给AI接上了一双可以操作Unity编辑器的手。这篇文章我会从原理讲起,给出一套能实际上手的配置流程,再分享我实际测试过的几个典型场景和踩坑经历。
1. 先搞清楚MCP在Unity开发里到底解决了什么
1.1 从"复制代码-粘贴运行"到"直接动手改编辑器"
过去使用AI辅助Unity开发,绝大多数人是这么干的:给ChatGPT或Copilot描述需求,拿到一段C#脚本,复制到工程里,编译,如果有报错再贴回去让它改。这个循环效率并不差,但有一个致命问题——AI只能处理代码文本,看不见你的场景里有什么。它不知道你现在Hierarchy窗口里挂了20个对象,不知道某个Prefab被哪个脚本引用,更别说让AI"先把场景里的Plane挪到墙角"这种非常自然的操作,因为编辑器里的状态AI完全感知不到。
MCP(Model Context Protocol)就是来解决这个信息断层的。它是一套协议,规定了AI大模型和外部工具之间如何进行"请求-响应"对话。只要你把工具封装成符合MCP协议的Server,AI客户端(比如Claude Desktop、Cursor、各种支持MCP的IDE插件)就能像打电话一样去调工具,拿到工具返回的结果再继续思考。MCP的官方定义很抽象,但你可以直接把它理解成AI世界的USB-C接口:以前每个设备都要专门的充电线,现在统一了,插上就能用。
1.2 Unity-MCP的两端架构
Unity-MCP这套方案通常包含两个部分:
- Unity编辑器插件:在Unity内部运行一个本地服务,监听某个TCP/WebSocket端口,接收并执行指令,然后把执行结果返回。它相当于一个"遥控器"的接收端。
- MCP Server进程:独立于Unity之外运行的小程序,以MCP协议和AI客户端通信,再把AI发来的工具调用翻译成Unity能理解的命令,通过本地端口发给Unity插件。
如果你用过VSCode或者Cursor,可能会看到MCP配置里有用npx启动命令的方式,也有用Python脚本作为Server的方式。无论哪种,最终都要通过Unity侧的MCP插件落地。
1.3 一句话总结它和你有什么关系
有了Unity-MCP,你可以用自然语言告诉AI:"在场景里创建一个Cube,加一个Rigidbody,把这个Cube的坐标设置到(0, 5, 0),然后运行游戏,把运行后的截图发给我看。" AI会真的去执行这些操作,而不是只甩给你一段代码。对于游戏策划、关卡美术这类不擅长写编辑器扩展的同事,这相当于给了他们一个自然语言版的"场景搭建控制台"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从零搭建:先把Unity编辑器变成可以遥控的状态
2.1 选择Unity版本和项目
我在测试时用的是Unity 2022.3 LTS。Unity-MCP插件对版本不算挑剔,2021.3以上的LTS版本基本都能正常工作。但有个前提条件:无论你用的是哪个版本,编辑器侧的服务代码必须能在你安装的Unity中编译通过。如果插件是用较新的C#语法写的,老版本Unity可能编译不过去。所以如果手里有多个版本的Unity,优先选LTS版本,能少踩不少编译坑。
创建一个新的3D项目,URP还是内置渲染管线都无所谓。建议用空项目测试,避免已有项目中的自定义脚本对测试结果产生干扰。我一开始在正式项目里测试,结果AI建了很多测试对象,清起来很麻烦。
2.2 导入Unity-MCP插件
目前Unity-MCP没有一个官方Asset Store版本,常见的是GitHub上的开源项目。导入方式通常有两种:
- 通过Package Manager的"Add package from git URL",填上插件仓库的git地址。
- 直接把插件文件夹拷贝到项目的
Assets目录下。
我用的是git URL方式,输入地址后Unity会拉取代码并编译。编译完成后,菜单栏会出现一个类似"MCP"或者"AI Tools"的入口。如果你找不到菜单,可以在Project窗口里搜索一下插件提供的类名,确认是否导入成功。
打开MCP窗口后,一般会让你配置三样东西:
- 端口号,我用的默认8765。
- Token字符串,用于鉴权,防止同一局域网的其他程序乱发指令。
- 是否允许在Play Mode下执行操作,这个建议先关掉,等测试稳定再打开。
配置完成后点击Start Server,如果状态变为Running,"遥控器"的接收端就就绪了。
2.3 Unity侧工具集:AI手里到底握了哪些牌
搞清楚Unity-MCP能调哪些工具,是后续高效使用的前提。虽然不同实现存在差异,但主流插件提供的功能基本围绕下面这些场景:
| 工具类别 | 典型工具 | 作用 |
|---|---|---|
| 场景感知 | get_hierarchy, get_scene_info | 获取当前场景的层级结构、对象列表 |
| 对象操作 | create_object, delete_object, duplicate_object | 创建、删除、复制GameObject |
| 组件操作 | get_components, add_component, set_property | 查看、添加组件,修改组件属性 |
| 运行控制 | enter_play_mode, exit_play_mode | 进入/退出Play模式 |
| 菜单操作 | execute_menu_item | 执行编辑器菜单命令,如"GameObject > Create Empty" |
| 结果反馈 | get_console_logs, take_screenshot | 读取日志、保存截图 |
| 资源操作 | refresh_asset_database, get_selection | 刷新资源库,获取当前选中对象 |
你看这个表会发现,这些工具本质上都是编辑器API的薄封装。AI之所以能"理解"工具,是因为每个工具的JSON Schema里有描述。所以你在使用Unity-MCP时,给AI的提示词越具体,AI越知道该调哪个工具。我自己实测的一句话经验:别让AI猜,直接把场景对象名和期望值写在Prompt里,它执行准确率会高很多。
3. 给AI客户端接上这根"控制线"
3.1 两种服务模式:stdio和WebSocket
MCP Server的启动模式大体分两类:
- stdio模式:AI客户端直接启动一个本地进程,通过标准输入输出和进程通信。这种模式适合本机使用,配置最简单,不需要开端口。
- WebSocket/Streamable HTTP模式:Server作为一个独立服务常驻,AI客户端通过网络连接它。Unity-MCP通常采用这种模式,因为Unity编辑器里的服务是独立进程的心跳,而且可以支持多个客户端同时接入。
我使用的是WebSocket模式。Unity插件监听本地端口,MCP Server进程负责和AI客户端通信。这种模式的另一个好处是,MCP Server可以先启动,Unity编辑器晚点再打开也没关系,AI发起工具调用时才会真正连接Unity。
3.2 在AI客户端里添加MCP配置
以Claude Desktop为例,配置文件通常是claude_desktop_config.json。不同的AI客户端有各自的配置入口,但核心字段大同小异。我贴一份我实际用的配置(改成你自己的Token):
json复制{
"mcpServers": {
"unity": {
"command": "npx",
"args": [
"-y",
"unity-mcp-server"
],
"env": {
"UNITY_MCP_WS": "ws://127.0.0.1:8765",
"UNITY_MCP_TOKEN": "your-secret-token"
}
}
}
}
如果你是使用Python实现MCP Server,配置大概长这样:
json复制{
"mcpServers": {
"unity": {
"command": "python",
"args": [
"/path/to/unity_mcp_server.py"
],
"env": {
"UNITY_MCP_WS": "ws://127.0.0.1:8765",
"UNITY_MCP_TOKEN": "your-secret-token"
}
}
}
}
这里有个细节容易被忽略:env里的变量是给MCP Server进程用的,不是在Unity插件里输入的Token。如果你Unity侧配置的Token是123456,AI客户端env里的UNITY_MCP_TOKEN也必须是123456,两边对不上就连接失败。
3.3 如何确认已经连上
配置完成后重启AI客户端,它应该能在MCP工具列表里看到Unity相关工具。接下来用一个最简单的指令验证:"你能看到当前Unity场景吗?请描述一下Hierarchy里有什么。"
如果AI回答得模棱两可或者直接说看不到,大概率是连接出了问题。你需要立刻去Unity编辑器的MCP窗口检查状态,同时看MCP Server进程的输出日志。一般日志里会打印"connected"或者报错信息。我第一次配置时就是Token漏配,Server日志里直接拒绝连接,排查起来非常快。
4. 实战演示:让AI从空白场景搭出可运行的测试关卡
4.1 我的第一个任务:一句话搭出物理沙盘
在连通之后,我试了一个最典型的任务,Prompt是这样的:
"请在当前空场景里创建一个地面(Plane),把它放在原点;创建一个Cube,坐标为(0, 0.5, 0),给它挂上Rigidbody组件;再创建一个Directional Light,旋转角度(50, -30, 0);然后进入Play模式运行,等待2秒后退出Play模式。"
我紧张地发了出去,结果是AI一连串地调用工具:create_object、add_component、set_property、enter_play_mode、exit_play_mode……过了一分钟,它回我一句:"已完成,场景中现在有Plane、Cube(带Rigidbody)和Directional Light。Cube在进入Play模式后受到重力下落了。"
那一刻的体验真的很奇妙,因为这和"AI给你代码"完全是两码事。那是真的在我编辑器里动了手。我切回Unity窗口,场景中确实多出了三个对象,而且Cube落到了地面上。如果你想要更稳定的运行指令,可以在Prompt里要求"先保存场景",这会提醒AI调用保存场景的工具。
4.2 中途修改需求:AI能理解增量变化
我又追加了一句:"Cube不要用默认材质,把它统一改成红色,位置回到(2, 1, 0),再截图给我看。"
这次AI先找到Cube对象,然后用set_property去修改Material的颜色属性。这里有一个坑:如果Cube没有材质实例,直接改Renderer.material.color可能只会改变场景中的临时实例,不会应用到Assets里的材质。所以AI正确的做法是先创建或加载一个材质,再赋给Renderer。我的MCP插件支持创建材质资源,于是我加了一句提示"创建红色材质并赋给Cube",AI照做了,然后调用take_screenshot返回图片路径。
从这以后我总结出一个规律:对于涉及资源的操作(材质、贴图、Prefab),不要指望AI自己脑补出资源路径,Prompt里给出明确的资源创建策略,它的成功率几乎能到100%。
4.3 从"命令"到"对话式开发"的范式转变
这个demo让我意识到,Unity-MCP带来的最大变化不是省了几步操作,而是AI能感知操作结果并基于结果继续决策。比如它有Cube的当前坐标,就知道下一步该怎么调整;它能读取Console日志,就能根据报错自动修复;它甚至能查看当前选中对象,然后围绕这个对象执行一系列操作。
这种能力一旦接入到实际工作流,可能改变我们做编辑器自动化工具的思路。以前我们写编辑器扩展是为了减少重复劳动,但脚本逻辑是固定的;现在你只需要描述需求,AI会自己去组合工具序列。它相当于把"编辑器扩展脚本"变成了可对话的实时服务。
5. 真正落地时会遇到的坑:我的完整排查过程
5.1 连接不上的排查:先分端还是后分端
最常见的故障就是AI客户端一直"呼叫"不到Unity。我的排查顺序是固定的:
先用命令行检查本地端口是否有监听。macOS/Linux用lsof -i :8765,Windows用netstat -ano | findstr 8765。如果没有任何输出,说明Unity侧的Server根本没启动,回到Unity检查MCP窗口状态。
如果端口有监听,但AI还是说没连接,下一步看Token。我建议故意在Unity侧换一个Token,然后在AI客户端env里也改成一个错误值,观察两边报错。如果报错信息包含"401"或"auth failed",那说明网络通路是通的,问题就在Token不匹配。这个方法比瞎猜快得多。
还要确认MCP Server进程确实读取到了env配置。有些AI客户端第一次配置MCP后需要重启整个应用才能加载新配置,如果客户端是热加载配置,可能环境变量没生效。重启一下,省去半小时排查时间。
5.2 命令超时和编辑器卡死:主线程的锅
Unity编辑器的API绝大多数只能在主线程调用。MCP Server通过WebSocket收到AI指令后,Unity插件接收到该指令去执行,需要把操作排到Editor线程。如果某个操作执行时间过长(比如加载大场景、编译脚本),AI端会等待超时。
我遇到过两次场景比较大的项目,AI调用get_hierarchy时返回时间超过60秒,导致AI以为失败,重复调用了好几次,编辑器也开始卡顿。后来我改用了插件的"扫描深度限制"功能,把hierarchy递归深度限制在5层以内,响应立刻快了。如果你用Unity-MCP时AI总在某一个工具上超时,优先检查是不是操作范围太大了。
5.3 安全边界要提前想清楚
MCP服务一旦运行,就等于把你的Unity编辑器开放给AI。Token只是基础防护,但如果你的MCP Server绑定在0.0.0.0,局域网内其他设备只要知道端口和Token也能接入。我在测试环境里就默认绑定了127.0.0.1,只允许本机进程访问。
还有一个容易被忽略的问题:AI可能会误删对象或执行不可逆操作。你可以通过Prompt去约束AI的行为,但最保险的方式是让Unity插件具备"只读模式"或"操作白名单"。我的方案是:在测试阶段关闭所有写操作工具,只用场景查看和运行截图功能。等确认AI稳定之后再放开写权限。
5.4 多个Unity项目同时打开的冲突
我有一段时间开着两个Unity项目调试,结果发现AI指令总是进入旧项目的编辑器。原因很简单:两个Unity编辑器都在监听8765端口,后来的项目因为端口冲突启用了另一个端口,但MCP Server配置还指向8765,流量都进了旧项目。
解决方法是给每个项目分配不同端口。在AI客户端的env里,你可以配置多个MCP Server,分别连接到不同端口:
json复制{
"mcpServers": {
"unity-project-a": {
"command": "npx",
"args": ["-y", "unity-mcp-server"],
"env": {
"UNITY_MCP_WS": "ws://127.0.0.1:8765",
"UNITY_MCP_TOKEN": "token-a"
}
},
"unity-project-b": {
"command": "npx",
"args": ["-y", "unity-mcp-server"],
"env": {
"UNITY_MCP_WS": "ws://127.0.0.1:8766",
"UNITY_MCP_TOKEN": "token-b"
}
}
}
}
这样你可以在同一个AI对话里明确告诉它"操作Project A",它就会调用A的工具,不会串到B项目。
6. 把Unity-MCP接入真实项目的三种姿势
6.1 快速原型:Game Jam里的"AI临时工"
在Game Jam里,时间就是一切。用Unity-MCP搭一个原型场景,可以把大量摆物件、调参数的重复劳动交给AI。比如你和队友决定做一款"小球收集物品"的玩法,你可以直接对AI说:"创建10个随机分布在-10到10范围内的球体,每个都加SphereCollider和文件夹中的CollectItem脚本。" 五分钟后场景就摆完了,你专心去改玩法脚本就行。
但要注意,AI生成的场景布局有时候不会自动保存Prefab,尤其在你要复用这些物体时。所以如果是原型阶段我会让它一次性生成所有对象并用代码记录坐标,后期手动调整。
6.2 自动化测试:让AI闭环跑回归
Unity项目越往后越怕改一处崩十处。传统做法是写EditMode/PlayMode测试脚本,但很多项目测试基建不完善。Unity-MCP提供了一种轻量方案:让AI按固定流程操作场景并收集结果。
我实际用过的流程是这样的:给AI一个任务清单,让它依次打开几个场景、检查Console日志里有没有报错、运行一定时间、截图。AI执行到某个步骤如果日志里出现Exception,它会停下来把异常文本发给我。这虽然不能替代完整自动化测试,但作为每天上班后的第一轮"冒烟测试"非常够用。
6.3 团队协作入口:策划美术也能用自然语言搭场景
如果你和我一样,经常被策划用"帮我放个东西"这种话打断,Unity-MCP可以成为异步协作的桥梁。你不需要在工位上亲自操作,策划可以通过你们配置好的AI助手提出"在场景地图东北角放一个NPC,朝向门方向",AI会调用Unity-MCP完成,并把结果截图发到群里。
这一步的前提是:你要提前给AI定义好团队的命名规范和Prefab路径,比如"所有NPC免费包里的角色放在Assets/Characters/NPC/Prefabs下"。AI不是万能的,好的规则约束能显著降低它的错误率。
我个人在实际使用中的体会是,Unity-MCP短期内最舒服的使用场景是"让AI做那些不需要创意但很繁琐的编辑器操作"。它的核心价值不是生成代码,而是让AI有机会在真实编辑器环境中验证自己的操作,然后基于结果进一步工作。如果你正准备开始折腾,建议不要一上来就接正式项目,先拿空场景跑两遍,把连接、Token、工具调用这些基本功摸熟,再逐步把权限放开。遇到卡住的时候,先怀疑配置,再怀疑代码,这能帮你省下大把时间。
