Unity编辑器的代码模式
Unity的代码模式 将Unity编辑器变成AI可控工具。它在编辑器内运行一个HTTP服务器,通过以下方式将场景操作、资产管理和属性检查作为结构化工具调用公开 UTCP协议 -让AI代理以开发人员通过UI的方式构建、检查和修改Unity项目。 这些工具组合在一起 UTCP编码模式 环境,为AI代理实现最大的性能和令牌效率,让他们在隔离的JS沙箱中调用工具。
快速入门
什么是代码模式?
与始终保持在LLM上下文中的严格MCP工具防御相反,CodeMode是一种帮助AI以最熟悉的方式调用工具的方法——通过基于TypeScript工具防御编写JavaScript代码。这有助于人工智能保持低令牌消耗,实现复杂任务的循环和链式调用,以紧凑的形式组织输出,并在一个JavaScript执行上下文中重用来自不同现有服务器和端点的输出,将LLM上下文与不必要的数据隔离开来。 这为不同环境之间的互动开辟了无限的可能性。以下是一些示例:
- 使用以下命令从混合器中移动场景 搅拌机MCP,将特定对象作为FBX直接导出到Unity项目中
- 使用 Figma MCP 从figma获取UI布局,并以智能的方式在项目中实现这些布局,而不是盲目地重新创建每个面板
- 使用 Cocos代码模式 在引擎之间执行游戏移植
- 带上你自己的例子🙃
所有这一切都可以通过UTCP团队提供的社区友好、灵活和开放的解决方案来实现: 代码模式 它是MCP服务器。 您可以在以下论文中阅读更多关于代码模式概念的信息: Anthropic, 苹果 和 云耀.
工具
| 类别 | 工具 | 目的 |
|---|---|---|
| 场景 | GameObjectGetTree, GameObjectGetAtPath, GameObjectCreate, GameObjectCreatePrimitive, GameObjectOperate | 导航并构建场景层次结构 |
| 组件 | GameObjectComponentsGet, GameObjectComponentAdd, GameObjectComponentRemove, GameObjectGetAvailableComponentTypes | 连接、拆卸和查找组件 |
| 检查员 | InspectorGetInstanceDefinition, InspectorGetInstanceProperties, InspectorSetInstanceProperties | 内省类型和读/写属性 |
| 资产 | AssetGetTree, AssetGetAtPath, AssetCreate, AssetImport, AssetOperate, AssetGetPreview | 浏览、创建和管理项目资产 |
| 编辑 | EditorOperate, EditorGetLogs, EditorGetScenePreview | 控制编辑器状态和捕获预览 |
| 设置 | SettingsGetDefinition, SettingsGetProperties, SettingsSetProperties | 读取和修改项目设置 |
运作原理
此扩展架构遵循 发现,然后行动 图案。AI代理从不猜测属性名称或组件结构——它们首先查询真实的定义。
1. Get the scene tree → find the object you need
2. Get its type definition → learn its actual properties
3. Set properties by name → make precise changes示例
// Find the camera
const tree = UnityEditor.GameObjectGetTree({});
const cameraTransform = tree.children[0].components[0]; // Transform ref
// Discover what properties Transform has
const def = UnityEditor.InspectorGetInstanceDefinition({ reference: cameraTransform });
// → "export class Transform { localPosition: Vector3; localRotation: Vector3; localScale: Vector3; }"
// Set multiple properties in one call
UnityEditor.InspectorSetInstanceProperties({
reference: cameraTransform,
propertyPaths: ["localPosition", "localRotation"],
values: [{ x: 0, y: 5, z: -10 }, { x: 30, y: 0, z: 0 }]
});技术实施细节
工具执行
HTTP请求在后台线程上到达。所有工具的执行都通过一个 EditorApplication.update 排队。
- 即发即弃工具 (void/UniTask返回)--排队并返回
{ success: true }立即。来电者没有等待。 - 价值回报工具 (T/UniTask\返回)-与完成源一起排队。HTTP响应会一直等待,直到工具在主线程上完成。
这意味着来自AI代理的链式调用不会阻止仅具有副作用的操作,如属性更改或编辑器命令。
工具声明
工具是标记为的纯静态方法 [UtcpTool]The ToolRegistry 在创业时通过Unity的 TypeCache,从它们的C#签名生成JSON模式,并在以下位置提供UTCP手册 /utcp 终点。
[UtcpTool("Get the hierarchy tree of a GameObject", httpMethod: "GET",
tags: new[] { "scene", "hierarchy", "tree" })]
public static SceneTreeItem GameObjectGetTree(InstanceReference reference)
{
// ...
}两种输入模式:
- 基于参数 --每个方法参数都成为一个输入字段
- 基于类 --单身
UtcpInput-复杂输入的派生类
此刻 刀具输出 总是应该有class类型或void,也可以是 UniTask 或 UniTask 用于异步操作。
实例引用
对象 作为轻量级手柄传递:
{ id: "29880", type: "Camera" }由树查询、组件查找和创建工具返回。它们在传递回时解析为Unity对象,通常使用 InstanceReference.Instance getter或with EditorUtility.InstanceIDToObject(id).
自定义AI代理编辑器
对于未经加工的组件 SerializedProperty 布局不能清晰地映射到AI代理应该看到的内容(RectTransform、Camera、AnimatorController等),代码模式提供了 AiAgentEditor 系统。
每位编辑都声明:
- 启用时 --绑定序列化属性和注册处理程序
- OnDump请求 --生成当前值的干净JSON快照
- On Definition已请求 --发出TypeScript类定义
编辑器支持继承。例如, ColliderAgentEditor (base)处理常见的对撞机属性,如isTrigger或物理材料; BoxColliderAgentEditor 使用特定类型的属性对其进行扩展:
[CustomAiAgentEditor(typeof(BoxCollider))]
public class BoxColliderAgentEditor : ColliderAgentEditor
{
private SerializedProperty m_Center;
private SerializedProperty m_Size;
protected override void OnEnable()
{
base.OnEnable();
m_Center = serializedObject.FindProperty("m_Center");
m_Size = serializedObject.FindProperty("m_Size");
AddSettingPropertyHandler("center",
() => m_Center.vector3Value.SerializeToJObject(),
v => m_Center.vector3Value = v.DeserializeToVector3());
AddSettingPropertyHandler("size",
() => m_Size.vector3Value.SerializeToJObject(),
v => m_Size.vector3Value = v.DeserializeToVector3());
}
protected override void OnDumpRequested()
{
base.OnDumpRequested();
DumpProperty("center", m_Center.vector3Value.SerializeToJObject());
DumpProperty("size", m_Size.vector3Value.SerializeToJObject());
}
protected override void OnDefinitionRequested()
{
base.OnDefinitionRequested();
EmitClassDefinition("BoxCollider", new List
{
TsPropertyDef.Field("center", "Vector3"),
TsPropertyDef.Field("size", "Vector3"),
}, "Collider");
}
}没有自定义编辑器的组件会退回到自动序列化 SerializedObject.
安装
- 打开包管理器→
+→ 从git URL添加包 - 输入:
https://github.com/romarogov/unity-code-mode.git?path=Packages/com.roro.codemode
添加自定义工具
using CodeMode.Editor.Tools.Attributes;
public static class MyTools
{
[UtcpTool("Describe what this tool does", httpMethod: "POST")]
public static MyResult DoSomething(string input, int count = 10)
{
// Implementation — runs on main thread
}
}启动时会自动发现工具。无需注册。
UTCP呼叫模板配置
此扩展还有一个用于UTCP调用模板的特殊配置实用程序,可用于将不同的UTCP工具(包括MCP服务器!)连接到一个代码模式执行上下文中。 可从以下网址访问 Code Mode → UTCP Templates 菜单。
您可以在中找到呼叫模板结构 UTCP文件:
整合
代码模式适用于任何兼容UTCP的客户端,包括 代码模式MCP服务器 AI助手。
MCP服务器配置
此扩展提供了UTCP代码模式MCP服务器的集成配置示例,其中包含预填充的配置路径 Preferences → Code Mode 页面:
{
"mcpServers": {
"code-mode": {
"command": "npx",
"args": ["@utcp/code-mode-mcp"],
"env": {
"UTCP_CONFIG_FILE": "/path/to/.utcp_config.json"
}
}
}
}Claude代码配置
要设置Claude Code代理以使用代码模式,请打开项目并运行以下命令:
Linux/MacOS:
claude mcp add --transport stdio --env UTCP_CONFIG_FILE="/path/to/.utcp_config.json" -- code-mode npx @utcp/code-mode-mcp窗户:
claude mcp add --transport stdio --env UTCP_CONFIG_FILE="/path/to/.utcp_config.json" -- code-mode cmd /c npx @utcp/code-mode-mcp