# EditorTools ## 模块概述 EditorTools 是框架的编辑器侧配套,覆盖 Inspector、自定义窗口、配置工具与代码生成流程,目的是降低模块接入与排查成本。 与 UI 最相关的部分是: - `UISettingEditorWindow` - `UIGenerateQuick` - `UIScriptGeneratorHelper` - `UIGenerateConfiguration` 它们共同组成了 **UIHolder 自动生成工作流**。 ## 快速开始 ### UI 绑定工具的基本使用流程 1. 打开 UI 生成配置窗口,配置 UI 规则 2. 把 UI 预制体放在配置的 `UIPrefabRootPath` 目录下 3. 按命名规范布置需要绑定的节点 4. 选中 UI 预制体根节点 5. 执行菜单 `GameObject/UI生成绑定` 6. 等待脚本编译完成 7. 生成器自动把 `XXXHolder` 挂回预制体,并回填控件字段 ## UIHolder 自动生成说明 ### 1. `UIHolder` 的定位 在本框架中: - `UIHolder` 指的是继承自 `UIHolderObjectBase` 的绑定类 - 它主要用于保存控件引用和资源标签 - 它不是主要的业务逻辑承载类 推荐方式: - **手写 Window / Widget 逻辑** - **自动生成 Holder 绑定类** ### 2. 使用哪个工具生成 核心入口: - 菜单:`GameObject/UI生成绑定` 对应代码入口位于: - `Packages/com.alicizax.unity.framework/Editor/UI/GenerateWindow/UIGenerateQuick.cs:1` 当你执行该菜单时,生成器会: - 检查当前选中的对象是否是 prefab - 读取 `UIGenerateConfiguration` - 校验 prefab 是否位于允许的 UI 根路径下 - 分析节点名并推断组件类型 - 输出 `UIHolder` 脚本 - 在脚本编译后自动挂到 prefab 上 - 自动把字段与节点/组件引用绑定完成 ### 3. 命名规则如何影响生成 生成器会结合: - `UIElementRegexConfigs` - `ComCheckSplitName` - `ComCheckEndName` - `ArrayComSplitName` 来识别节点绑定信息。 例如默认配置会把: - `Btn#Close@` 识别为按钮字段 - `Text#Title@` 识别为文本字段 - `Img#Icon@` 识别为图片字段 ### 4. 生成结果是什么 生成出的 Holder 类通常: - 继承 `UIHolderObjectBase` - 自动带有 `UIResAttribute` - 自动写入资源路径常量 - 自动生成字段与公开访问器 这使得 UI 逻辑层可以直接通过泛型 Holder 访问控件,而无需再手动查找。 ## 相关工具与职责 ### `UISettingEditorWindow` 作用: - 维护 UI 生成配置 - 配置输出目录、命名空间、Prefab 根路径、资源加载方式 ### `UIGenerateQuick` 作用: - 提供快速菜单入口 - 校验当前对象是否可生成 ### `UIScriptGeneratorHelper` 作用: - 扫描节点 - 推断字段名和组件类型 - 生成代码 - 在脚本重载后自动挂载脚本并绑定字段 ### `UIGenerateConfiguration` 作用: - 保存生成规则与路径设置 - 支持不同项目或不同目录使用不同配置 ## 使用示例 ```csharp // 推荐流程: // 1. 设计 InventoryItem.prefab // 2. 选中 prefab 根节点 // 3. 执行 “GameObject/UI生成绑定” // 4. 得到 InventoryItemHolder : UIHolderObjectBase // 5. 在业务代码中编写: // public sealed class InventoryItemWidget : UIWidget { ... } ``` ## 最佳实践 - 把 UI 生成规则纳入项目模板,避免每个模块自行定义一套命名方式 - Holder 文件视为“生成产物”,不要手工长期维护 - 如果修改了 prefab 绑定节点,重新执行一次生成工具 - 逻辑类和生成类分离,减少合并冲突 ## 常见错误 ### 预制体不在配置的 UI 根路径下 - 现象:执行生成工具无结果 - 原因:`UIGenerateQuick.CheckCanGenerate` 校验失败 ### 修改了预制体但没重新生成 Holder - 现象:字段缺失或控件引用错误 - 处理:重新执行 `GameObject/UI生成绑定` ### 手动改了生成类名称或命名空间 - 现象:逻辑类泛型类型失配 - 处理:尽量不要手改生成文件,必要时同步更新生成配置与逻辑类引用