移动/游戏
在 Unity 6.0+ 中处理 UI Toolkit 的…
适用于理解、编辑或生成 Unity UI Toolkit 的 UXML/USS/Manipulator,并处理运行时绑定与场景 PanelSettings。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Unity 6.0+ 中处理 UI 特定
解决思路
- 处理 Unity UI Toolkit 任务前,按需读取本技能目录下的参考文件:`references/uss-guide.md` 用于 USS 模式与示例。
- 仅在生成图标时读取 `references/svg-icons.md`。
- 读取 `references/common-issues.md` 了解常见错误并在写文件前复查。
- 仅在用户要求数据绑定或涉及绑定时读取 `references/ui-runtime-binding.md`,获取运行时数据绑定模式。
- 当需要渐变、自定义形状、进度环、程序化绘制或 USS 无法表达的视觉效果时,读取 `references/painter2d.md` 使用 Painter2D API。
- 仅在用户要求 Manipulator 或涉及 Manipulator 时读取 `references/pointermanipulator-guide.md`,用于拖放或 VisualElement 简单事件处理。
- 仅在创建可复用 Custom UI Element(UXML、USS、C#)时读取 `references/custom-elements.md`,用于复杂组件复用。
- 参考文件路径相对于技能文件夹,例如直接读取 `references/uss-guide.md`。
- 向用户解释 UI 结构时,使用树形格式:`[ElementType] name="elementName" class="class1 class2"`,子级用 `├──`、`└──`、`│` 缩进表示。
- 改变按钮颜色:编辑该按钮对应的 USS 选择器。
- 在某处添加 label:在 UXML 中指定位置添加元素。
- 放大元素:在 USS 中编辑 width/height。
- 隐藏元素:在 USS 中加 `display: none` 或从 UXML 移除。
- 重命名元素:更新 UXML 中的 `name` 属性。
- 不要过度编辑:只修改被要求的内容。
- 保持原格式和结构。
- 不要“改进”无关代码。
- 除非被要求,否则不要添加注释。
- 对针对性修改,优先修改具体元素或选择器,而不是重写整个文件;但如果修改涉及文件大部分内容,重写可能更清晰,需自行判断。
- 编辑时注意不要意外删除已有元素、样式或引用。
- 编辑 USS 时聚焦与请求相关的属性和选择器,避免不必要重组;若修改确实需要,才重构。
- 无法在 Editor 外验证 UXML 或 USS;Unity 在导入时解析并在 Console 报错,因此写完文件后让用户检查结果。
- 校验工作流第1步:将完整文件写入项目目标路径;不要写部分内容或草稿,因为 Editor 一旦读取到半成品 UXML 就会解析错误。
- 校验工作流第2步:让用户聚焦 Unity Editor,以触发变更资源重新导入。
- 校验工作流第3步:让用户在 Console 报告问题;UXML 解析错误会给出文件和行号,USS 问题通常显示为未知属性或选择器警告。
- 校验工作流第4步:修复用户报告的问题,并从第1步重复。
- 因为反馈需要用户往返,第一次就做对:在让用户检查前完成所有文件,使一次重导入覆盖全部,而不是每个文件一次。
- 写文件前重读 `references/uss-guide.md` 和 `references/common-issues.md`,而不是等报错后再读。
- 警惕能通过解析但渲染错误的错误;这些不会出现在 Console,需要用户肉眼检查 UI,`references/common-issues.md` 列出了这些情况。
- 创建新 UI 时,只生成被请求的内容。
- 请求仅 USS:只输出 `.uss` 文件。
- 请求仅 UXML:只输出 `.uxml` 文件。
- 请求 UI screen/menu/panel:只输出 `.uss` + `.uxml`。
- 请求“with code”/“with logic”/“functional”:输出 `.uss` + `.uxml` + `.cs`。
- “proper buttons”不暗示 C#,应输出样式良好的 Button 元素。
- “currency display”不暗示 C#,应输出 Label 元素。
- “working UI”不暗示 C#,应输出有效可渲染的 UXML/USS。
- “inventory screen”不暗示 C#,只做视觉布局。
- “inventory system”/“equipment system”/“crafting system”:先问“Should items be draggable?”;若可以,读取 `references/pointermanipulator-guide.md` 获取模式。
- 生成工作流第1步 Analyze:确定确切需要哪些文件,不要多余文件。
- 生成工作流第2步 Search:查找已有 USS、UXML、资源;不要假设路径。
- 生成工作流第3步 Follow project patterns:匹配文件夹结构和命名约定。
- 生成工作流第4步 Reuse:检查共享样式表,合适就复用。
- 生成工作流第5步 Write USS first:先写 USS,并对照下面的限制校验。
- 生成工作流第6步 Write UXML:写 UXML,引用 USS,并校验结构。
- 生成工作流第7步:完整写出文件,绝不写部分内容;错误反馈方式见 Validation。
- 生成工作流第8步 Scene setup:若把 UI 添加到场景,分配 PanelSettings。
- 生成工作流第9步 Data binding:若被要求,添加带运行时数据绑定模式的 C# 脚本(见 `references/ui-runtime-binding.md`);如需要,生成 ScriptableObject 资源,并在 UXML 中把资源赋给 UI 元素根节点,或在 C# 中通过 datasource 赋值。
- 默认确保文本可读:选择颜色时确保文本与背景有足够对比;但尊重有意低对比的用法(禁用态、占位文本、装饰元素);使用 design token 时检查文本变量和背景变量提供足够对比。
- 严格遵守用户给出的精确值:十六进制颜色、像素尺寸、间距都按给定值使用,不要近似或替换。
- 样式化 UI 或调整主题时,不仅应用到当前 UXML 中的直接元素,也要应用到 UI Toolkit 的核心元素,因为它们通常由多个子元素组成。
- 优先遵循项目模式:应用默认值前先搜索已有文件。
- `name` 属性使用 camelCase,例如 `submitButton`,不要 `submit-button`。
- `class` 属性/USS 使用 kebab-case,例如 `.submit-button`,不要 `.submitButton`。
- 文件路径使用功能文件夹,例如 `Assets/UI/Inventory/`,不要 `Assets/Scripts/UI/`。
- 输出格式:对 UXML 使用 ```uxml Filename.uxml ... ```;对 USS 使用 ```uss Filename.uss ... ```。
- Unity USS 是 CSS 子集,下列属性不存在,绝不使用。
- 不要用 `border` 简写;改用 `border-width`、`border-color` 分开写。
- 不要用 `gap`;改用子元素的 `margin`。
- 不要用 `z-index`;改用 DOM 顺序或父级嵌套。
- 不要用 `pointer-events`;改用 UXML 的 `picking-mode` 属性。
- 不要用 `filter`;不支持。
- 不要用 `outline`;改用 `border-*` 属性。
- 不要用 `box-shadow`;改用嵌套元素或背景图片。
- 不要用 `:first-child`、`:last-child`、`:nth-child`;改用显式 class。
- 不要用 `[attribute]` 选择器;改用显式 class。
- 不要用 `transition-property: <value>`;完全省略,或仅用 `none`/`initial`/`inherit`。
- 不要用 `linear-gradient()`、`radial-gradient()`;改用带 Painter2D 的自定义 `VisualElement`(见 `references/painter2d.md`)。
- 绝不在 UXML 中使用内联样式 `style="..."`;所有样式只放在 USS。
- 绝不在 `url()` 中使用外部路径;只能用 `url("project://database/Assets/...")`。
- 优先使用灵活布局而非硬编码尺寸:用 `flex-grow`、`flex-shrink` 或 `%`,而不是固定 `width`/`height`。
- 让元素自然流动,并由父容器约束。
- 只在根容器或确实需要固定尺寸时才设置明确像素尺寸。
- 子元素应适应可用空间,而不是自己定义尺寸。
- USS 保持简洁:不要写默认值(`flex-direction: column` 是默认值)。
- 不要写默认字体。
- 不要写冗余约束(`width: 100px` 不需要 `min-width`/`max-width`)。
- 不要写重叠属性(`flex: 1` 已设置 grow/shrink)。
- 使用能生效的最简单选择器。
- 绝不重复选择器。
- 每个 UXML 文件必须声明命名空间:`<ui:UXML xmlns:ui="UnityEngine.UIElements">`。
- 每个 UXML 文件必须链接样式表:`<ui:Style src="Screen.uss" />`。
- 每个 UXML 文件必须有且只有一个顶层容器。
- 每个 UXML 文件不得有 `style="..."` 属性;只使用 USS。
- 使用示例结构:`<ui:UXML xmlns:ui="UnityEngine.UIElements"><ui:Style src="Panel.uss" /><ui:VisualElement name="root" class="panel">...</ui:VisualElement></ui:UXML>`。
- 使用 Pointer Manipulator 处理 VisualElement 上的事件和交互(见 `references/pointermanipulator-guide.md`)。
- 若要求拖放,写 pointer Manipulator,并在 UXML 中或通过 C# 附加到相关 Visual Element。
- 对简单点击事件,可在 UXML 中使用 `clickable` manipulator。
- 对更高级交互,创建/使用更传统的 C# 事件回调,并按需附加到元素。
- 对 inventory/crafting 系统:当用户请求 “inventory system”、“equipment system” 或 “crafting system” 时,明确询问:“Should players be able to drag and drop items?”
- 如果回答可以,读取 `references/pointermanipulator-guide.md` 获取 inventory/crafting 专用模式。
- 如果回答不可以或不明确,只创建静态布局。
- 不要引用 `UnityDefaultRuntimeTheme.tss` 或 Unity 内置主题图标。
- 图标优先级第1:复用已有项目图标。
- 图标优先级第2:生成 SVG(见 `references/svg-icons.md`)。
- 图标优先级第3:最后才用图像生成器。
- 引用格式:`background-image: url("project://database/Assets/UI/Textures/icon.png");`。
- PanelSettings 必需;没有它 UI 不会渲染。
- 场景设置第1步:搜索已有 PanelSettings 资源。
- 场景设置第2步:若没有,创建通用资源 `Assets/UI/PanelSettings.asset`。
- 场景设置第3步:赋给 UIDocument 的 `Panel Settings` 字段。
- Editor UI(EditorWindow、PropertyDrawer)跳过 PanelSettings。
- 仅在请求 C# 时生成 C#。
- C# 中通过 USS class 设置样式(`AddToClassList()`);绝不用 `element.style.*` 作为内联样式,因为内联样式比 USS 选择器优先级更高,无法通过样式表覆盖,并增加逐元素内存开销。
- UITK 使用 TextCore 文本资源;使用 `FontAsset`、`TextStyleSheet`、`TextSettings`,不要使用 TextMeshPro 对应项(`TMP_FontAsset` 等)。
- 将脚本放在与 UXML/USS 相同的文件夹中。
适用边界 · 注意事项
- 不适用于非 Unity 项目,或未使用 UI Toolkit(UIElements/UXML/USS)的任务。
- 不适用于 Unity 6.0 以下或需要 UGUI/IMGUI/TextMeshPro 而非 UI Toolkit 的工作流;除非明确要求迁移或混用。
- 在没有 Unity Editor 可重新导入并反馈 Console 的环境中,验证流程无法闭环,不适用。