其他
在 MSW 引擎中通过 UIBuilder 构建与修改…
当需要创建、修改或调试 MSW 的 .ui 界面文件(布局、组件、层级、运行时交互)时,用 builder 而非手改 JSON 来完成。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
在 MSW 引擎中通过 UIBuilde特定
解决思路
- 先明确意图:画出布局草图(ASCII 或文字描述),并确定要挂到哪个 UIGroup 下。
- 查阅设计指南:至少匹配 ui-fundamentals / ui-hierarchy / component-api 的 Component Selection Guide 之一。
- Builder 预检:先阅读 ../msw-general/references/builder-protocol.md(核心)与 builder-protocol-ui.md §3(统一调用协议入口)。
- 匹配配方:从 layout-recipes.md 中选择最接近的模板。
- 调用 builder:通过 scripts/msw_ui_builder.cjs 创建/修补(协议见 builder-protocol-ui.md §3)。
- 注入绑定:通过 b.write(path, { bind: {...} }) 或 b.injectBindings(...) 自动注入 .mlua 属性默认 UUID(builder-protocol-ui.md §3.6 Binding Injection)。
- 自检:write() 会自动运行 scripts/ui_lint.cjs(默认严格模式开启)。
- 预览:通过 scripts/preview_ui_layout.cjs 做可视化检查。
- 音效处理:对任何交互按钮,主动建议接入 click/hover SFX(references/ui-sound.md)。
- Maker 刷新:应用到引擎。
- 绝不直接编辑 .ui JSON——创建/修改必须走 scripts/msw_ui_builder.cjs,手改会破坏 UUID·ValueType·@components 一致性并导致静默丢失。
- 读取已有 .ui 文件也要走 builder——用 UIBuilder.read(filepath) / .find() / .listEntities() 查询,不要直接 grep/解析原始 JSON;.ui 的直接 Read 与 cat/type/Get-Content/rg/grep/sed/awk/cp/mv 等 shell 命令会被 guard 拦截;删除整个 .ui 文件用 node -e "require('fs').unlinkSync('ui/<File>.ui')" 再 refresh。
- 不要直接设置 Position——只用 anchoredPosition(Position 由引擎管理)。
- 不要在固定锚点(AnchorsMin == AnchorsMax)上用 OffsetMin/Max 表达尺寸的同时又用 anchoredPosition——两种模式不要混用。
- 注意 builder 会创建新 UUID 但不会更新 .mlua 属性默认值——会导致绑定断裂。
- 任何 .ui 修改前,必须让 builder-protocol.md(核心)+ builder-protocol-ui.md §3 处于上下文中(本会话未加载过或被压缩丢失时才需重读)。
- 调用 builder 前至少检查一份设计指南(ui-fundamentals / ui-hierarchy / component-api §Component Selection Guide)。
- 优先匹配配方,最后才从零构建。
- 边缘放置使用公式:pos = ±(margin + size/2)。
- 弹窗和 toast 要放进各自独立的 .ui 根 UIGroup,单独显示/隐藏;内部容器用 empty() / panel(),绝不要嵌套 group()。
- 检查文本 Alignment 默认是 UpperLeft(0)——95% 的“我居中了但它贴左”问题源于此。
- 按钮触摸目标 ≥ 88×88(移动端支持)。
- 创建任何交互按钮后,主动建议通过 references/ui-sound.md 接入 click/hover SFX(有默认 UI SFX RUID);仅当用户明确拒绝或按钮纯装饰时跳过。
- 按嵌套结构建树,不要扁平化:同一单元内的控件(窗口 + 标题/关闭、行 + chip/value、槽位 + 图标/数量)必须通过 "Parent/Child" 路径共享父节点,以便作为整体移动/淡入淡出/切换/绑定;先建父再建子,缺父会导致 lint 失败(L025 ERROR)。
- 不要把根级文本叠放在同级盒子上——ui_lint 会报 L030 WARN;应把文本嵌到盒子下,用 button() 做可点击带标签盒子,或通过 panel() / sprite() 的 text 选项直接加标签。
适用边界 · 注意事项
- 需要 .map / .model / .tileset 构建器时——不在本技能范围内。
- 需要无障碍模式(alt 文本、屏幕阅读器提示、焦点顺序)时——未覆盖。
- 需要错误态 UI 模式(禁用按钮样式、校验消息、加载 spinner)时——未覆盖,需按项目临时设计。
- 需要自定义着色器材质(MaterialId)时——字段虽暴露但着色器编写不在本技能范围内。