AlicizaX/Client/Assets/Books/Framework/Editor/EditorTools.md

158 lines
3.9 KiB
Markdown
Raw Normal View History

2026-04-01 13:20:06 +08:00
# 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<InventoryItemHolder> { ... }
```
## 最佳实践
- 把 UI 生成规则纳入项目模板,避免每个模块自行定义一套命名方式
- Holder 文件视为“生成产物”,不要手工长期维护
- 如果修改了 prefab 绑定节点,重新执行一次生成工具
- 逻辑类和生成类分离,减少合并冲突
## 常见错误
### 预制体不在配置的 UI 根路径下
- 现象:执行生成工具无结果
- 原因:`UIGenerateQuick.CheckCanGenerate` 校验失败
### 修改了预制体但没重新生成 Holder
- 现象:字段缺失或控件引用错误
- 处理:重新执行 `GameObject/UI生成绑定`
### 手动改了生成类名称或命名空间
- 现象:逻辑类泛型类型失配
- 处理:尽量不要手改生成文件,必要时同步更新生成配置与逻辑类引用