news 2026/9/15 11:15:02

unity-mcp `manage_ui` 工具全解:用 AI 驱动 Unity UI Toolkit(UXML / USS / UIDocument)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
unity-mcp `manage_ui` 工具全解:用 AI 驱动 Unity UI Toolkit(UXML / USS / UIDocument)

unity-mcpmanage_ui工具全解:用 AI 驱动 Unity UI Toolkit(UXML / USS / UIDocument)

【免费下载链接】unity-mcpUnity MCP acts as a bridge between AI assistants and your Unity Editor. Give your LLM tools to manage assets, control scenes, edit scripts, and automate tasks within Unity.项目地址: https://gitcode.com/GitHub_Trending/un/unity-mcp

导读

本文围绕 unity-mcp 的manage_ui工具展开,讲解如何让 AI 助手直接读取、创建、修改和删除 Unity UI Toolkit 的 UXML 文档、USS 样式表与 UIDocument 组件,并能对界面视觉树进行运行时检查与截图自评。读完本文,你将掌握manage_ui的全部 14 种 action 的用法、参数语义与调用限制,并能基于仓库源码理解其路径校验、内容编码、UXML 预校验等底层机制,直接在自己的 Unity 项目中搭建「AI 驱动的前端式 UI 工作流」。

manage_ui定义于 Python 工具注册文件,其 Unity 侧实现位于 ManageUI.cs,工具分组为ui,默认在 tool-groups 中属于可开关的工具组。从源码看,它同时覆盖了「文件操作」「组件挂载」「运行时修改」「视觉截图」四类能力,是 Unity MCP 中处理 UI Toolkit 的核心入口。


一、为什么需要manage_ui:从「写死 UI」到「对话式建 UI」

Unity 项目中的 UI 通常有两种体系:基于 Canvas 的 uGUI 和现代的UI Toolkit。UI Toolkit 采用接近前端开发的模式——UXML 负责结构(类似 HTML),USS 负责样式(类似 CSS),并通过UIDocument组件挂到场景 GameObject 上渲染。unity-mcp 的manage_ui就是为这套工作流量身定制的桥梁:AI 助手无需手动打开编辑器、拖拽组件,只需按工具约定的参数发起调用,即可在 Unity 编辑器内完成从「创建 UXML 文件」到「挂载到场景」再到「运行时改样式、截图验证」的闭环。

在 技能参考文档 中,UI Toolkit 场景被明确指向使用manage_ui;而 workflows.md 则进一步强调:对于新项目,UI Toolkit 是首选 UI 体系,manage_ui是其唯一入口。

推荐的工作流总览

文档给出的标准流程可以概括为 10 步:

  1. list发现已有的 UI 资源;
  2. create创建 UXML 文件(结构,类似 HTML);
  3. create创建 USS 文件(样式,类似 CSS);
  4. link_stylesheet把 USS 链接进 UXML;
  5. attach_ui_document将 UXML 作为UIDocument挂到 GameObject 上;
  6. get_visual_tree检查渲染结果;
  7. modify_visual_element修改实时元素的文本、class 或内联样式;
  8. render_ui截图 UI 面板用于 AI 自评;
  9. detach_ui_document从 GameObject 移除 UIDocument;
  10. delete删除.uxml/.uss文件。

一个必须记住的坑:UXML 中引用样式必须写<ui:Style>(带ui:命名空间前缀),不能写裸的<Style>。UI Builder 无法打开使用裸<Style>的文件。这一点同时出现在工具描述与工作流文档中,属于高频踩坑点。


二、参数总表:一次看懂全部入参

manage_ui的参数覆盖四类用途:文件操作、组件挂载、截图渲染、运行时元素修改。下表汇总全部参数(对应 工具签名 与 参考文档):

参数类型必填说明
actionLiteral枚举要执行的动作(14 种,见下节)
pathstr \| NoneAssets 相对路径,如Assets/UI/MainMenu.uxmlAssets/UI/Styles.uss;对render_ui也可是直接渲染的 UXML 路径(无需场景 GameObject)
contentsstr \| None文件内容(UXML 或 USS 标记),纯文本,编码自动处理
targetstr \| None目标 GameObject 名称或路径(attach_ui_document/get_visual_tree/render_ui使用)
source_assetstr \| NoneUXML VisualTreeAsset 路径,如Assets/UI/MainMenu.uxml
panel_settingsstr \| NonePanelSettings 资源路径;省略时自动创建默认项
sort_orderint \| NoneUIDocument 排序顺序(默认 0)
scale_modeLiteral枚举 | NonePanel 缩放模式(ConstantPixelSize/ConstantPhysicalSize/ScaleWithScreenSize)。遗留简写,推荐用settings字典
reference_resolutiondict[str, int] \| None参考分辨率{width, height}。遗留简写,推荐用settings字典
settingsdict[str, Any] \| None通用 PanelSettings 属性字典(见下节详解)
max_depthint \| None视觉树遍历最大深度(默认 10)
widthint \| None渲染宽度像素(默认 1920),用于render_ui
heightint \| None渲染高度像素(默认 1080),用于render_ui
include_imagebool \| None是否在响应中内联返回 base64 PNG(默认 false),用于render_ui
max_resolutionint \| None内联 base64 图片最大分辨率(默认 640),用于render_ui
screenshot_file_namestr \| None渲染输出自定义文件名(默认自动生成),用于render_ui
output_folderstr \| None渲染输出目录。项目相对路径(如Assets/ScreenshotsCaptures)或项目内绝对路径;覆盖用户的编辑器偏好设置。省略时回退到编辑器偏好,再回退到内置默认Assets/Screenshots,用于render_ui
stylesheetstr \| None要链接的 USS 样式表路径,如Assets/UI/Styles.uss,用于link_stylesheet
filter_typestr \| None按类型过滤 UI 资源:uxmlussPanelSettings,或省略表示全部,用于list
page_sizeint \| None每页结果数(默认 50),用于list
page_numberint \| None页码,从 1 开始(默认 1),用于list
element_namestr \| None要修改的视觉元素名称(UXML 中的name属性),用于modify_visual_element
textstr \| NoneLabel / Button 元素的新文本内容,用于modify_visual_element
add_classeslist[str] \| None要添加到元素的 USS class 名称,用于modify_visual_element
remove_classeslist[str] \| None要从元素移除的 USS class 名称,用于modify_visual_element
toggle_classeslist[str] \| None要在元素上切换的 USS class 名称,用于modify_visual_element
styledict[str, Any] \| None要设置的内联样式,如{'backgroundColor': '#FF0000', 'fontSize': 24},用于modify_visual_element
enabledbool \| None设置元素启用/禁用状态,用于modify_visual_element
visiblebool \| None设置元素可见性(display: flex/none),用于modify_visual_element
tooltipstr \| None设置元素 tooltip 文本,用于modify_visual_element

返回值:一个dict,包含 Unity 的响应。具体结构随 action 不同而变化,下文逐一说明。


三、14 种 action 逐一拆解

3.1ping:连通性检查

返回pong,附带tool: "manage_ui"标识,用于确认 Unity 侧工具已正确注册。Unity 侧实现见 ManageUI.cs。

3.2 文件操作:create/read/update/delete

这四个 action 负责.uxml.uss文件的生命周期,源码层面存在一套严格的双层校验

  • Python 侧前置校验(manage_ui.py):路径必须位于Assets/下、不允许..路径穿越、扩展名必须是.uxml.uss。对应集成测试见 test_manage_ui.py。
  • Unity 侧写入校验(ManageUI.cs):
    • 写入前对 UXML 做 XML 合法性解析(ValidateUxmlContent),解析失败则拒绝写盘并返回带行列号的错误;校验通过后还会自动注入editor-extension-mode="False"属性(EnsureEditorExtensionMode),保证文件能被 UI Builder 正常打开;
    • 文件使用UTF-8 无 BOM编码写入(Utf8NoBom)——Unity 6 的 UI Builder 无法打开带 BOM 的 UXML;
    • 写盘后通过AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate)强制导入,并尝试加载为VisualTreeAsset做导入后验证,解析失败时以 warning 形式提示。
    • create时若文件已存在会报错,提示改用update覆盖;update时若文件不存在会提示先用create

内容编码细节create/updatecontents在传输前会被 base64 编码为encodedContents并置contentsEncoded=true(manage_ui.py),测试中明确断言原始contents不会出现在参数里(test_manage_ui.py);read的响应同样以 base64 返回,Python 侧收到后自动解码还原为明文contents字段(manage_ui.py)。

调用示例:

# 创建 UXML(结构) manage_ui( action="create", path="Assets/UI/MainMenu.uxml", contents='''<ui:UXML xmlns:ui="UnityEngine.UIElements"> <ui:Label text="Hello World" /> </ui:UXML>''' ) # 读取现有文件(响应中 contents 为解码后的明文) result = manage_ui(action="read", path="Assets/UI/MainMenu.uss") # 更新文件 manage_ui( action="update", path="Assets/UI/MainMenu.uss", contents=".title { font-size: 64px; color: yellow; }" ) # 删除资源(通过 AssetDatabase,删除失败有兜底 File.Delete) manage_ui(action="delete", path="Assets/UI/OldPanel.uxml")

注意:create传入非法扩展名(如.cs)会直接返回错误「Invalid file extension… Must be .uxml or .uss.」,这部分逻辑由 Python 侧与 Unity 侧各自实现、双重把关。

3.3link_stylesheet:给 UXML 挂上 USS

该 action 在 UXML 根节点<ui:UXML>起始标签之后插入一行<ui:Style src="project://database/Assets/UI/Styles.uss" />(实现见 ManageUI.cs)。细节:

  • 会先检查是否已存在相同链接(同时匹配src="..."src="project://database/..."两种写法),重复调用幂等返回alreadyLinked=true
  • 插入点查找FindUxmlBodyStart会跳过 XML 注释中的伪匹配,且根节点若为自闭合标签则拒绝插入;
  • 若 UXML 中已有<ui:Style><Style>引用,此 action 主要用于「结构上补挂样式表」,例如在工作流第 1~4 步中把新建的 USS 挂进新建的 UXML。

3.4attach_ui_document/detach_ui_document:挂载与卸载

attach_ui_document完成三件事(ManageUI.cs):

  1. 通过ObjectResolver.Resolve按名称/路径查找目标 GameObject(找不到报错);
  2. 加载source_asset指定的VisualTreeAsset(找不到报错);
  3. 解析 PanelSettings:显式传入panel_settings则加载该资源;否则先全局查找现有t:PanelSettings,找不到就在Assets/UI/DefaultPanelSettings.asset自动创建默认项;
  4. Undo记录操作后,为 GameObject 添加(或复用)UIDocument组件,设置visualTreeAssetpanelSettingssortingOrder

示例(完整建 UI 屏幕,出自 workflows.md):

# 1. 创建 UXML(结构) manage_ui( action="create", path="Assets/UI/MainMenu.uxml", contents='''<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements"> <ui:Style src="Assets/UI/MainMenu.uss" /> <ui:VisualElement name="root" class="root-container"> <ui:Label text="My Game" class="title" /> <ui:Button text="Play" name="play-btn" class="menu-button" /> <ui:Button text="Settings" name="settings-btn" class="menu-button" /> <ui:Button text="Quit" name="quit-btn" class="menu-button" /> </ui:VisualElement> </ui:UXML>''' ) # 2. 创建 USS(样式) manage_ui( action="create", path="Assets/UI/MainMenu.uss", contents='''.root-container { flex-grow: 1; justify-content: center; align-items: center; background-color: rgba(0, 0, 0, 0.8); } .title { font-size: 48px; color: white; -unity-font-style: bold; margin-bottom: 40px; } .menu-button { width: 300px; height: 60px; font-size: 24px; margin: 8px; background-color: rgb(50, 120, 200); color: white; border-radius: 8px; } .menu-button:hover { background-color: rgb(70, 140, 220); }''' ) # 3. 创建 GameObject 并挂载 UIDocument(panel_settings 省略时自动创建) manage_gameobject(action="create", name="UIRoot") manage_ui( action="attach_ui_document", target="UIRoot", source_asset="Assets/UI/MainMenu.uxml" ) # 4. 验证视觉树 manage_ui(action="get_visual_tree", target="UIRoot", max_depth=5)

detach_ui_document则查找目标 GameObject 上的UIDocument组件,通过Undo.DestroyObjectImmediate移除并返回被移除的sourceAsset路径(ManageUI.cs)。目标上没有 UIDocument 时会明确报错。

3.5create_panel_settings/update_panel_settings:PanelSettings 资产

PanelSettings 控制 UI 面板如何渲染(缩放、DPI、清屏、动态图集等)。create_panel_settings的路径支持.asset自动补全(传入Assets/UI/MyPanel会自动补成.asset),已存在则报错;update_panel_settings则要求settings字典至少含一个可识别属性,否则报错「No recognised properties were applied. Check the key names.」(ManageUI.cs)。

settings字典支持的键(工具签名 与 ApplyPanelSettingsProperties 实现 完全一致):

取值/结构说明
scaleModeConstantPixelSize|ConstantPhysicalSize|ScaleWithScreenSize缩放模式
referenceResolution{width, height}参考分辨率
screenMatchModeMatchWidthOrHeight|ShrinkToFit|ExpandToFill屏幕匹配模式
match0–1 浮点宽高匹配权重(实现中会Mathf.Clamp01钳制)
referenceDpi/fallbackDpi浮点参考/回退 DPI
sortingOrder整数排序顺序
targetDisplay整数目标显示器
clearColor布尔是否清屏颜色
colorClearValue#RRGGBB{r,g,b,a}清屏颜色值
clearDepthStencil布尔是否清理深度模板
themeStyleSheet资源路径主题样式表(需能加载为ThemeStyleSheet
dynamicAtlasSettings{minAtlasSize, maxAtlasSize, maxSubTextureSize, activeFilters}动态图集设置

两个额外实现细节:

  • 键名匹配是大小写与下划线不敏感的:scale_modescaleModeScaleMode都会命中同一个scalemode分支(NormalizeKey去下划线并小写);
  • 未识别的键会被静默忽略(不影响已识别键生效),所以在update_panel_settings中「一个属性都没生效」时才会报错。

遗留简写scale_modereference_resolution两个顶层参数仍被支持(见 test_manage_ui.py 的断言),但当传入settings字典时,字典优先、简写被跳过。

示例:

# 创建 ScaleWithScreenSize 面板 manage_ui( action="create_panel_settings", path="Assets/UI/GamePanelSettings.asset", scale_mode="ScaleWithScreenSize", reference_resolution={"width": 1920, "height": 1080} ) # 或推荐写法:用 settings 字典一次性配置 manage_ui( action="create_panel_settings", path="Assets/UI/GamePanelSettings.asset", settings={ "scaleMode": "ScaleWithScreenSize", "referenceResolution": {"width": 1920, "height": 1080}, "screenMatchMode": "MatchWidthOrHeight", "match": 0.5, "colorClearValue": "#000000" } ) # 挂载时指定自定义 PanelSettings manage_ui( action="attach_ui_document", target="UIRoot", source_asset="Assets/UI/MainMenu.uxml", panel_settings="Assets/UI/GamePanelSettings.asset" )

3.6get_visual_tree:检查运行时视觉树

对目标 GameObject 上的 UIDocument 视觉树做深度优先序列化(ManageUI.cs):

  • 返回每个节点的type(C# 类型名)、nameclassestext(TextElement 才有)、以及resolvedStyle(含 width、height、color、backgroundColor、fontSize,非默认值才输出,颜色为#RRGGBBAA十六进制);
  • max_depth控制遍历深度(默认 10),超过深度时以childCount+truncated: true截断提示;
  • 若目标没有 UIDocument 或视觉树尚未构建,返回明确的错误/空树提示。

这是 AI 确认「UI 到底长什么样」的关键动作——先get_visual_tree拿到结构,再据此modify_visual_element

3.7modify_visual_element:运行时改元素

element_name(UXML 的name属性)在视觉树中用root.Q(elementName)查找元素并就地修改(ManageUI.cs)。支持的修改项:

  • 文本text(仅 Label/Button 等TextElement支持,其他元素报错);
  • class 操作add_classes(去重后添加)、remove_classestoggle_classes
  • 内联样式style字典,支持backgroundColor/background-colorcolorfontSize/font-sizewidthheightopacitydisplayvisibilityflexGrow/flex-growflexShrink/flex-shrink、四边margin*、四边padding*borderRadius/border-radius(四角统一设置)。未知样式键不会让调用失败,而是记入skipped列表并提示(见 ApplyInlineStyles);
  • 状态enabledSetEnabled)、visible(映射为display: Flex/None)、tooltip

响应中返回modifications(实际生效项列表)、currentClasseselementType;若没有任何修改项生效会返回错误并给出可用参数提示。此 action 是「AI 实时调 UI」的核心:无需改文件、无需重新导入,立即作用于运行中的视觉树。

manage_ui( action="modify_visual_element", target="UIRoot", element_name="play-btn", text="START", add_classes=["highlight"], toggle_classes=["menu-button"], style={"backgroundColor": "#FF0000", "fontSize": 24}, enabled=True, tooltip="Click to start" )

3.8render_ui:截图自评(编辑器与运行模式两套机制)

render_ui把 UI 面板渲染成 PNG 截图,供 AI 自评界面效果。实现位于 ManageUI.cs,其关键约束与行为:

运行模式(Play Mode)

  • 由于PanelSettings.targetTexture在同一帧内赋值后无法同步读取,工具采用协程两段式截图:第一次调用通过ScreenshotCapturer.Begin排队一帧WaitForEndOfFrame屏幕捕获(含 UI Toolkit 覆盖层),返回pending=true与提示「Call render_ui again to retrieve the rendered image」;第二次调用时取出保存的 PNG,写入文件并返回hasContent=true与图片数据。
  • 同一时间只允许一个捕获在途,重复发起会返回capture_in_progress错误(附retry_after_ms: 100)。

编辑器模式(Editor Mode)

  • 为 PanelSettings 创建/复用RenderTexture(作为资源保存在Assets/UI/RT_MCP_UI_Render_*.renderTexture,并按s_panelRTs字典按 PanelSettings 实例 ID 缓存),targetTexture赋值后强制重绘;首次赋值当帧内容为空,响应会提示「Call render_ui again to capture the rendered UI」,读取成功后把targetTexture置回 null 恢复屏幕渲染。该模式为尽力而为,可能返回空白图hasContent=false提示「no visible content detected」)。
  • 不传target时,可通过path传 UXML 路径直接渲染(工具内部创建隐藏临时 GameObject__MCP_UI_Render_Temp__挂载 UIDocument,用完后销毁)。

通用输出行为

  • 分辨率由width(默认 1920)/height(默认 1080)控制;
  • 输出目录解析顺序:output_folder参数 → 编辑器偏好(ScreenshotPreferences)→ 内置默认Assets/Screenshots
  • 文件名默认ui-render-{yyyyMMdd-HHmmss}.pngscreenshot_file_name可覆盖(自动补.png),重名自动追加-1-2后缀;
  • include_image=true时在响应中内联 base64 PNG,超过max_resolution(默认 640)时先降采样;同时返回path(项目相对路径)、fullPathwidthheighthasContent,命中 Assets 目录时自动AssetDatabase.ImportAsset以便资源管理器可见。
# 第一次调用:排队捕获(Play Mode) result = manage_ui(action="render_ui", target="UIRoot", width=1280, height=720) # -> {"pending": true, "note": "A screen capture was scheduled..."} # 第二次调用:取回 PNG result = manage_ui(action="render_ui", target="UIRoot", width=1280, height=720, include_image=True, max_resolution=480, screenshot_file_name="my-preview", output_folder="Assets/Screenshots") # -> {"path": "Assets/Screenshots/my-preview.png", "hasContent": true, # "imageBase64": "...", "imageWidth": ..., "imageHeight": ...}

3.9list:发现 UI 资源

filter_typeuxml/uss/PanelSettings,或省略全部)与path作用域(默认Assets)搜索资源(ManageUI.cs):

  • 底层使用AssetDatabase.FindAssets("t:VisualTreeAsset" / "t:StyleSheet" / "t:PanelSettings")
  • 支持page_size(默认 50)与 1 基page_number分页,响应包含totalpageSizepageNumberassets(每项含pathtypename)。
# 列出全部 UI 资产 result = manage_ui(action="list") # 只列 USS,分页查看第 2 页 result = manage_ui(action="list", filter_type="uss", page_size=20, page_number=2)

四、源码级机制:调用路由与安全边界

4.1 读操作与写操作走不同通道

manage_ui在 Python 侧把 action 分为两类(manage_ui.py):

  • 变更类(mutation)createupdatedeleteattach_ui_documentdetach_ui_documentcreate_panel_settingsupdate_panel_settingsrender_uilink_stylesheetmodify_visual_element—— 走send_mutation
  • 只读类pingreadget_visual_treelist—— 走send_with_unity_instance(async_send_command_with_retry, ...)

集成测试 test_manage_ui.py 专门验证了这种路由:read走非变更路径、create走变更路径,且None参数会被完全剔除,不会进入发送给 Unity 的参数包。

4.2 双端路径校验:防穿越、限 Assets

无论是 Python 侧(os.path.normpath后检查..段、首段必须为assets、扩展名白名单)还是 Unity 侧(AssetPathUtility.SanitizeAssetPath+ValidExtensions),都对path做了严格约束。测试覆盖了「路径在 Assets 之外」「Assets/../etc/passwd.uxml穿越」「非法扩展名」三种场景(test_manage_ui.py)。这意味着 AI 无法通过manage_ui在项目外写入任意文件,安全边界由工具本身强制保证。

4.3 资源生命周期管理

ManageUI类在静态构造时注册了EditorApplication.quittingAssemblyReloadEvents.beforeAssemblyReload回调,统一清理缓存的所有 RenderTexture(CleanupRenderTextures:释放、按资产路径删除或DestroyImmediate),避免域重载/退出时泄漏(ManageUI.cs)。


五、实战组合拳:一个完整的主菜单制作流程

把上面的能力串起来,一套「AI 从零建主菜单」的完整调用序列(摘自 workflows.md 并补充 render_ui 自评环节):

# ① 建 UXML 结构(含 ui:Style 前缀的样式引用) manage_ui(action="create", path="Assets/UI/MainMenu.uxml", contents='''<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements"> <ui:Style src="Assets/UI/MainMenu.uss" /> <ui:VisualElement name="root" class="root-container"> <ui:Label text="My Game" class="title" /> <ui:Button text="Play" name="play-btn" class="menu-button" /> <ui:Button text="Settings" name="settings-btn" class="menu-button" /> <ui:Button text="Quit" name="quit-btn" class="menu-button" /> </ui:VisualElement> </ui:UXML>''') # ② 建 USS 样式 manage_ui(action="create", path="Assets/UI/MainMenu.uss", contents='''.root-container { flex-grow: 1; justify-content: center; align-items: center; background-color: rgba(0, 0, 0, 0.8); } .title { font-size: 48px; color: white; -unity-font-style: bold; margin-bottom: 40px; } .menu-button { width: 300px; height: 60px; font-size: 24px; margin: 8px; background-color: rgb(50, 120, 200); color: white; border-radius: 8px; } .menu-button:hover { background-color: rgb(70, 140, 220); }''') # ③ 挂 UIDocument 到场景 GameObject(省略 panel_settings 自动创建默认面板) manage_gameobject(action="create", name="UIRoot") manage_ui(action="attach_ui_document", target="UIRoot", source_asset="Assets/UI/MainMenu.uxml") # ④ 检查视觉树 manage_ui(action="get_visual_tree", target="UIRoot", max_depth=5) # ⑤ 运行时微调:把 Play 按钮文本改掉并高亮 manage_ui(action="modify_visual_element", target="UIRoot", element_name="play-btn", text="START", add_classes=["highlight"]) # ⑥ 截图自评(Play Mode 需调用两次;编辑器模式首次可能空白,重试一次) manage_ui(action="render_ui", target="UIRoot", width=1280, height=720, include_image=True) manage_ui(action="render_ui", target="UIRoot", width=1280, height=720, include_image=True) # ⑦ 收尾:卸载 UIDocument、删除资源 manage_ui(action="detach_ui_document", target="UIRoot") manage_ui(action="delete", path="Assets/UI/MainMenu.uss")

六、常见报错与排查指引

现象原因与对策
Invalid file extension '.cs'. Must be .uxml or .uss.create/read/update/delete只接受.uxml/.uss,检查path扩展名
path must be under 'Assets/'/path must not contain traversal sequences路径必须以Assets/开头且禁止..穿越
File already exists at ... Use 'update' action to overwrite.create遇到已存在文件,改用update
File not found: ... Use 'create' action for new files.update遇到不存在文件,先create
UXML validation failed — file was NOT written. ...UXML 是畸形 XML,Unity 侧在写盘前拦截,按行列号修复
Could not find target GameObject: ...target名称/路径无法被 ObjectResolver 解析
GameObject '...' has no UIDocument component.目标上未挂UIDocument,先attach_ui_document
Visual element with name '...' not found in the visual tree.element_name与 UXML 中name属性不一致,先get_visual_tree确认
Cannot capture: another capture is already in progress.Play Mode 下同时只有一个截图在途,稍等(retry_after_ms: 100)再调
No recognised properties were applied. Check the key names.update_panel_settingssettings键全部未识别,对照第三节键表
UI Builder 打不开生成的 UXML检查是否用了裸<Style>(必须<ui:Style>);工具已自动注入editor-extension-mode且用 UTF-8 无 BOM 写入,可先排除这两个因素

七、扩展阅读

  • 工具完整签名与自动生成文档:manage_ui 参考文档;
  • Python 侧定义与参数路由:Server/src/services/tools/manage_ui.py;
  • Unity 侧 14 种 action 的完整实现:MCPForUnity/Editor/Tools/ManageUI.cs;
  • 参数路由与 base64 编码的集成测试:Server/tests/integration/test_manage_ui.py;
  • UI 体系选型与完整工作流:unity-mcp-skill/references/workflows.md、unity-mcp-skill/references/tools-reference.md;
  • 工具分组说明:website/docs/guides/tool-groups.md。

综上所述,manage_ui把 UI Toolkit 的「文件、挂载、检查、修改、截图」全链路暴露给 AI:既有前端式的 UXML/USS 文件工作流,也有运行时视觉树检查与元素级修改,还内置了截图自评能力与双端安全校验。结合仓库源码理解其底层实现后,你可以放心地在自动化管线中用它完成 UI 的创建、迭代与回归验证。

【免费下载链接】unity-mcpUnity MCP acts as a bridge between AI assistants and your Unity Editor. Give your LLM tools to manage assets, control scenes, edit scripts, and automate tasks within Unity.项目地址: https://gitcode.com/GitHub_Trending/un/unity-mcp

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 11:09:56

DINOv3 超参数调优速查:批次大小、学习率、权重衰减一次配好

DINOv3 超参数调优速查&#xff1a;批次大小、学习率、权重衰减一次配好 【免费下载链接】dinov3 Reference PyTorch implementation and models for DINOv3 项目地址: https://gitcode.com/GitHub_Trending/di/dinov3 这是一篇 DINOv3 超参数调优速查&#xff0c;解决三…

作者头像 李华
网站建设 2026/9/15 11:05:16

Python实现高效whois查询工具的技术解析

1. 为什么需要自己实现whois查询工具在网络安全和运维工作中&#xff0c;whois查询是最基础但也是最重要的信息收集手段之一。作为一名长期从事安全开发的技术人员&#xff0c;我经常需要快速获取域名的注册信息、过期时间、DNS服务器等关键数据。虽然网上有很多现成的whois查询…

作者头像 李华