UIModule 界面系统
UIModule 管理窗口资源、创建队列、分组排序、焦点、动画和销毁。窗口逻辑继承 UIWindowBase,业务通常只调用 Show、Hide、Destroy,不直接实例化 UI Prefab。
子功能
快速使用
显示、隐藏和销毁窗口:
csharp
UtilFunc.ShowUI<UIShopWindow>(shopId, () =>
{
// Create、Init、Show 操作均已执行。
});
UtilFunc.HideUI<UIShopWindow>(() =>
{
// Hide 操作已执行。
});
bool exists = UtilFunc.HasUI<UIShopWindow>();
UtilFunc.DestroyUI<UIShopWindow>();也可以直接使用 Module:
csharp
UIModule ui = UIModule.Get();
if (ui == null)
return;
ui.PreLoad<UIShopWindow>();
ui.Show<UIShopWindow>(shopId);
ui.Hide<UIShopWindow>();
ui.Destroy<UIShopWindow>();Show 和 Hide 会进入 UI 操作队列。完成回调表示相应队列操作已执行,不表示动画以同步方式阻塞到结束;动画由管线逐帧推进。
设计思路
UIModule 把“资源尚未完成”和“窗口生命周期操作”统一进可合并的请求队列,使连续 Show/Hide/Destroy 不会对同一 Prefab 产生竞态。窗口一旦 Init,资源句柄所有权交给 UIWindowBase;Init 前取消则仍由队列释放,所有权边界明确。
分组栈负责层级与焦点,窗口类只表达自己的业务生命周期。Widget 和循环视图继续拆分窗口内部表现,避免所有代码堆进 Module 或窗口主类。
注意事项
- Prefab、Binding 和 Logic 必须对应同一个窗口类型与命名;绑定节点改名或移动后必须重新生成 Binding。
BindEvent不自动退订,生命周期不配对会留下已销毁窗口回调。BindAsset的资源由窗口统一释放,不要重复释放底层句柄。RestoreLinked不清屏;严格顺序恢复前应预加载窗口。hideOnDestroy当前只是序列化预留项;需要销毁窗口时显式调用Destroy/DestroyUI。- 外部
UICameraBridge必须唯一,并在 UIModule 初始化前生效。 - Scene 内窗口被场景销毁时应依赖
UIWindowSceneBridge通知框架,不要绕过 UIModule 手工销毁普通窗口。 - 本地化 uGUI Text 应使用
LocalizedText或UIFontBinding,Prefab 不保存项目字体直接引用。 - UI 生成与绑定命名规则详见编辑器工具中的 UI Generator 页面。
