# UI 窗口系统 ## 目的 记录 StrayFog 窗口管理、资源加载、生命周期、UIMono 绑定和虚拟列表的稳定使用规则。 ## 主要路径 | 类型 | 路径 | 说明 | |---|---|---| | ESF 源码 | `Assets/StrayFog/Editor/CopyToX/CopyToHF/UIWindowMgr/` | 窗口框架真实源码 | | HF 生成代码 | `Assets/Game/GameHFScripte/CopyToHF/UIWindowMgr/` | CopyToX 结果,禁止手改 | | 业务窗口 | `Assets/Game/GameHFScripte/GameFunction/UIWindows/` | 窗口与子组件业务逻辑 | | Mono 组件 | `Assets/Game/GameMono/Scripts/UIMono/` | SFUI/UIMono 和列表包装 | | UI 资源 | `Assets/Game/GameHFResource/<语言>/UIWindows/` | Prefab 与窗口资源 | ## 打开流程 ```text HFFunCatalogue.UIManager.OpenWindow() -> HFUIWindowMgr 创建窗口任务 -> 读取 HFAssetBundlePath / HFUIWindowLayer -> 复用缓存或创建窗口逻辑 -> LoadInMemory 加载 Prefab -> BindGameObject / OnAttachWindow -> OnRunAwake(实例首次绑定) -> OnOpen(每次打开) ``` 关闭窗口会执行 `OnClose`、隐藏实例并放入窗口缓存。需要释放窗口与资源时使用 UI 管理器公开卸载入口,不直接 Destroy 窗口 Prefab 或绕过管理器修改父节点和 siblingIndex。 ## 生命周期 | 生命周期 | 用途 | |---|---| | `OnRunAwake` | 查找控件、绑定按钮、配置并初始化虚拟列表,只执行一次 | | `OnOpen` | 注册本次打开所需事件、刷新数据与显示状态 | | `OnClose` | 移除事件、停止计时器和清理本次打开状态 | 异步加载、动画和下载的成功、失败、取消路径都必须结束窗口任务,不能让窗口永久停在加载中。 ## 使用规则 - 窗口继承 `AbsHFUIWindow`,配置 `HFAssetBundlePath` 和 `HFUIWindowLayer`。 - 打开和关闭统一通过 `HFFunCatalogue.UIManager`。 - `OnOpen` 与 `OnClose` 中的事件注册和释放保持对称。 - 引用绑定优先使用项目 UIMono/SFUI 流程,不堆叠 `transform.Find`。 - 单列虚拟列表使用 LoopListView2 包装接口,多列布局使用 LoopGridView 包装接口。 - 模板节点在 Prefab 中保持禁用,由虚拟列表创建实例。 - UI 修改必须验证脚本、Prefab 层级、RectTransform、组件状态和运行时效果。 ## 子文档 - [UI 开发指南](开发指南.md) - [界面拼接](界面拼接.md) - [UI 拼接工具](../编辑器工具/UI拼接工具.md) ## 文档关联 | 文档 | 关联原因 | |---|---| | [模块索引](../../模块索引.md) | 模块入口和状态 | | [资源管理](../资源管理/README.md) | UI Prefab 加载与卸载 | | [事件系统](../事件系统/README.md) | 窗口事件生命周期 | | [架构说明](../../../rules/10-架构说明.md) | ESF/HF 源码边界 | | [开发规则](../../../rules/20-开发规则.md) | UI 与 Prefab 通用约束 |