🎯 本篇目标
在前三篇基础上,完成一个可在运行时热更新的 UI 系统:
- 主工程提供 UI 框架基础设施(Canvas、EventSystem、面板管理器接口)
- 热更代码实现具体面板逻辑(登录界面、公告弹窗)
- 通过 Addressables 同时热更 UI Prefab 和 C# 脚本
- 编辑器 + 真机验证完整流程
💡 核心原则:UI 框架在主工程(AOT),面板内容在热更代码。这样框架稳定不频繁更新,业务面板随时可热修。
🏗️ 第一步:主工程搭建 UI 框架
创建 UI 管理器接口
在 Assets/Scripts/Framework/ 下创建 IUIManager.cs(主工程 AOT 侧):
1 | using UnityEngine; |
实现 UI 管理器
创建 UIManager.cs(主工程 AOT 侧):
1 | using UnityEngine; |
注册全局服务定位器
创建 GameServiceLocator.cs(主工程 AOT 侧):
1 | using GameFramework.UI; |
🔥 第二步:热更代码实现面板逻辑
创建面板基类
在 Assets/HotUpdate/UI/ 下创建 HotUpdatePanelBase.cs:
1 | using UnityEngine; |
实现登录面板
创建 LoginPanel.cs(热更代码):
1 | using UnityEngine; |
实现公告弹窗
创建 NoticePanel.cs(热更代码):
1 | using UnityEngine; |
🎨 第三步:创建 UI Prefab 并接入 Addressables
制作登录面板 Prefab
- 在场景中创建 Canvas → Panel,命名为
LoginPanel - 添加子对象:
Title(Text)、UsernameInput(InputField)、LoginButton(Button)、StatusText(Text) - 挂载
LoginPanel脚本(来自 HotUpdate 程序集) - 拖入
Assets/HotUpdateResources/Prefabs/保存为 Prefab - 删除场景中的实例
制作公告面板 Prefab
同上步骤,创建 NoticePanel Prefab。
标记为 Addressable
- 选中两个 Prefab → Inspector 勾选 Addressable ✅
- Addressable Name 分别设为
LoginPanel和NoticePanel - 分配到 Remote Group
⚠️ 关键:Prefab 上挂载的脚本必须来自 HotUpdate 程序集,否则热更后无法替换逻辑。
🔗 第四步:热更入口串联 UI 流程
更新 Assets/HotUpdate/GameHotEntry.cs:
1 | using UnityEngine; |
主工程调用热更入口
更新主工程的 GameEntry.cs,在 DLL 加载完成后调用:
1 | // 在 Assembly.Load(dllBytes) 之后追加: |
▶️ 第五步:编辑器验证
- 确保 Addressables Play Mode Script 设为 Use Existing Build
- 执行 Addressables → Build → New Build
- 执行 HybridCLR → Build → Build Assets
- 将生成的 DLL 复制到
Assets/HotUpdateResources/并刷新 Addressables - 运行场景,Console 应输出:
1
2
3
4
5
6[HotEntry] 🚀 热更代码初始化开始
[UIManager] ✅ Panel opened: LoginPanel
[LoginPanel] ✅ 热更登录面板已打开
[UIManager] ✅ Panel opened: NoticePanel
[NoticePanel] ✅ 热更公告面板已打开
[HotEntry] ✅ 热更UI系统初始化完成
🌐 第六步:真机热更验证
模拟热修流程
- 修改
LoginPanel.cs中的标题文字为"🎮 紧急修复版 v2.1" - 重新执行 HybridCLR → Build → Build Assets
- 复制新 DLL 到 Addressables Remote 构建目录
- 执行 Addressables → Build → Update Previous Build
- 上传更新后的 ServerData 到服务器
/var/www/hotupdate/ - 真机重启游戏 → 自动拉取新 DLL → 登录面板显示新标题
💡 这就是热更新的核心价值:改一行文案,玩家下次启动自动生效,无需商店审核。
❓ 常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
| 面板打开但脚本不执行 | Prefab 挂载的不是 HotUpdate 程序集的脚本 | 检查脚本命名空间和 asmdef 引用 |
| GetComponent 返回 null | 热更 DLL 未加载就调用了 UI | 确保 DLL 加载完成后再 OpenPanel |
| 按钮点击无响应 | BindClick 路径错误 | 用 Hierarchy 确认子对象路径完全匹配 |
| 热更后面板还是旧逻辑 | DLL 未被正确替换 | 检查 Addressables Catalog 是否更新 |
| 跨程序集类型找不到 | AOT 元数据缺失 | LoadMetadataForAOTAssembly 补充 |
🗺️ 系列导航
| 篇目 | 状态 |
|---|---|
| ① 概念篇 | ✅ 已发布 |
| ② 环境篇 | ✅ 已发布 |
| ③ Addressables 集成 | ✅ 已发布 |
| ④ UI 实战篇(本篇) | ✅ 已发布 |
| ⑤ 避坑与优化篇 | 🔜 下一篇 |
下一篇预告:汇总 HybridCLR 上线前必踩的坑——AOT 泛型补充、代码裁剪防护、打包报错排查、性能分析、iOS 审核注意事项,帮你平稳投产。
说些什么吧!