158 lines
3.9 KiB
Markdown
158 lines
3.9 KiB
Markdown
|
|
# 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生成绑定`
|
|||
|
|
|
|||
|
|
### 手动改了生成类名称或命名空间
|
|||
|
|
|
|||
|
|
- 现象:逻辑类泛型类型失配
|
|||
|
|
- 处理:尽量不要手改生成文件,必要时同步更新生成配置与逻辑类引用
|