KiHan UI 框架详解
基于 NGUI 的自研 UI 框架。UIWindow 是所有视图基类(557 行),KHUIManager 是全局基础设施(~2630 行,95KB)。
关联文档:ui-framework.md(全景)、tui-component-library.md(组件库)、ngui-framework.md(渲染层)、main-ui.md(主界面入口)、redpoint-framework.md(红点)
0. 一句话总览:剧院类比
| 层 |
类比 |
职责 |
| NGUI 层 |
舞台灯光设备 |
UIPanel / UIWidget / UICamera(渲染+输入),KiHan 定制版 3.5.7,122 类 |
| UIWindow 层 |
剧场管理制度 |
开关动画、层级、异形屏、Modal、音效(自研) |
| View 层 |
具体剧目 |
业务 View(继承 UIWindow,嵌 ViewArg 输入模型) |
| KHUIManager |
剧院经理 |
所有 View 的生命周期/层级/事件 |
1. 核心机制
双层级模型
WindowLayer(大层,权威定义在 Data/UIDef.cs)
UIDef.LayerDepth(层内深度)
- depth 会动态重排
UIWindow 生命周期 ★注意真实顺序
1 2 3 4 5 6 7 8 9 10 11
| Prefab 实例化(KHUIManager) → Awake() ├─ OnInitWindow() 绑控件、注册事件 ├─ OnInitWindowCompleted() 延迟一帧,子节点就绪 └─ IPX Bound 初始化(18:9 异形屏) → OnInitData(object _data) ★ 早于 OnOpenWindow!收 ViewArg 准备数据 → OnOpenWindow() ★ 后触发!数据已就绪,做首次渲染 → OnReOpenWindow(object) 已打开又被重开(复用,不重建 Prefab) → [可见期间] IsAnimating 管理交互屏蔽 → PlayCloseWindowAni() → OnCloseWindow() 关闭动画完成(清订阅/停定时器) → DoCloseWindow() → OnDestroyWindow() 仅 DestroyWindow 路径(真销毁)
|
关闭 ≠ 销毁 ★最高频的坑
- 普通
CloseWindow → 只 HideWindow(SetActive false),实例保留复用
- 只有
DestroyWindow 路径 → DoCloseWindow 真销毁
- →
OnCloseWindow 里必须清干净监听/定时器,否则复用时报残留 bug
三级触摸屏蔽
- 打开/关闭动画期间
IsAnimating = true 全局屏蔽 UI 触摸
- 动画完成且无其它窗口在动画时恢复
- 完整三级机制见
ui-framework.md §3.16
2. 关键可重写方法速查
| 方法 |
时机 |
典型用途 |
OnInitWindow() |
Awake 第一帧 |
绑 NGUI Widget、注册 EventListener |
OnInitWindowCompleted() |
延迟一帧 |
子节点就绪后操作 |
OnInitData(object) |
打开时(早于 OnOpen) |
接 ViewArg、备数据 |
OnOpenWindow() |
数据就绪后 |
首次渲染、弹 Tips |
OnReOpenWindow(object) |
已存在被重开 |
刷新数据(不重建) |
OnCloseWindow() |
关闭动画完成 |
注销监听、停定时器 |
OnDestroyWindow() |
Destroy 前 |
清 Model 引用、释放资源 |
3. TUI 组件库
- NGUI 之上的自研组件库(
framework/tui-component-library.md,48KB 全量手册)
- 分组:Normal / Icon / Button / Player / Ninja / 通用 View / Template
- 按示意图搭 UI:走
workflows/mockup-to-tui-prefab.md SOP(识别原则:按结构信号,不按业务名)
4. 与其它系统衔接
| 系统 |
关系 |
文档 |
| Plugin 框架 |
View 由 Plugin 的 Views[] 注册,经 ViewOperation 打开 |
[[KiHan Plugin框架详解]] |
| 红点 |
KHRedPointManager 双通道 + LockSysHash 三向映射 |
redpoint-framework.md |
| 主界面入口 |
BtnDestination/StateBit/open_sys ID 三套编号 + CanUnlock 判定 |
main-ui.md |
| UI 基类演进 |
LuaBehaviour → LuaUIWindow → ActBehaviourEntity 三代 |
domains/ui-architecture-evolution.md |
5. 排查速查
| 现象 |
先查 |
| 界面数据不显示 |
OnInitData vs OnOpenWindow 顺序搞反了(数据要放前者) |
| 复用后状态残留 |
OnCloseWindow 没清监听/定时器 |
| 点击穿透/失灵 |
IsAnimating 屏蔽窗口;三级触摸屏蔽(§3.16) |
| 层级穿层/遮挡 |
WindowLayer / LayerDepth 配置;depth 动态重排 |
| 异形屏错位 |
IPX Bound(KHUIManagerAdapter 有 Loading 类特例) |
| 入口不显示 |
main-ui.md 的 LockSysHash 判定链 + static 解锁快照(换区残留 F1) |
6. 记忆口诀
数据进 OnInitData,渲染放 OnOpenWindow;
关闭只藏不销毁,OnClose 清理要做全;
层级两把尺:WindowLayer 定层,LayerDepth 定位。
相关笔记
- [[KiHan Plugin框架详解]](谁打开 View)
- [[KiHan 网络框架详解]](数据从哪来)
本文从 LearnByCompany 原始文档 自动同步。