🎯 本篇目标
完成以下闭环:
- 使用 Addressables 管理热更程序集生成的 DLL
- 运行时从 Addressables 加载热更 DLL 并注入 HybridCLR
- 编辑器下一键验证 + 真机远程更新流程打通
💡 前置条件:已完成第二篇环境搭建,HybridCLR Installer 已成功执行。
📦 第一步:安装 Addressables
- Window → Package Manager → Unity Registry
- 搜索
Addressables→ 点击 Install - 等待安装完成,菜单栏出现 Window → Asset Management → Addressables
初始化 Addressables 设置
- Window → Asset Management → Addressables → Settings
- 首次打开会提示创建默认设置,点击 Create Addressables Settings
- 确认
Assets/AddressableAssetsData目录已生成
🔧 第二步:配置热更程序集
创建热更 Assembly Definition
- 在
Assets下新建文件夹HotUpdate - 右键 → Create → Assembly Definition,命名为
HotUpdate - 选中该 asmdef,Inspector 中设置:
| 属性 | 值 | 说明 |
|---|---|---|
| Name | HotUpdate | 程序集名称 |
| Root Namespace | HotUpdate | 命名空间 |
| References | 留空或按需添加 | 不要引用其他热更程序集以外的 asmdef |
| Override References | ❌ 不勾选 | 使用默认引用即可 |
注册到 HybridCLR
- HybridCLR → Settings
- 在 Hot Update Assemblies 列表中点击 +
- 输入
HotUpdate(必须与 asmdef 的 Name 完全一致) - 点击 Save
⚠️ 关键:此步骤告诉 HybridCLR 哪些程序集需要被热更。遗漏会导致 DLL 不被处理。
🏗️ 第三步:编写第一个热更脚本
在 Assets/HotUpdate/ 下创建 HelloHotUpdate.cs:
1 | using UnityEngine; |
在主工程(非 HotUpdate 文件夹)创建一个入口脚本 GameEntry.cs:
1 | using UnityEngine; |
⚠️ 注意:
LoadMetadataForAOTAssembly仅用于补充 AOT 元数据。实际热更 DLL 的执行由 HybridCLR 解释器自动接管,无需手动 LoadAssembly。上面示例为简化演示,实际项目中 DLL 加载逻辑见第四步。
📂 第四步:将热更 DLL 接入 Addressables
构建热更 DLL
- 菜单栏 HybridCLR → Build → Build Assets
- 选择目标平台(先用 Windows Standalone 验证)
- 构建完成后,DLL 输出到
HybridCLRBuild/HotUpdateDlls/<Platform>/HotUpdate.dll
复制到 Addressables 可识别路径
1 | # 创建资源目录 |
标记为 Addressable
- 在 Project 窗口选中
HotUpdate.dll.bytes - Inspector 中勾选 Addressable ✅
- 将 Addressable Name 改为
HotUpdate.dll.bytes(保持与代码中 LoadAssetAsync 的参数一致) - 将该资源分配到 Remote Group(非 Local),确保走远程更新通道
修改主工程入口代码(正式版)
1 | using UnityEngine; |
▶️ 第五步:编辑器验证
使用 Addressables Play Mode Script
- Window → Asset Management → Addressables → Profiles
- 当前 Profile 切换为 Default
- Window → Asset Management → Addressables → Settings
- 找到 Play Mode Script → 选择 Use Existing Build (requires built groups)
构建 Addressables Content
- Window → Asset Management → Addressables → Groups
- 菜单 Build → New Build → Default Build Script
- 等待构建完成
运行验证
- 将
GameEntry挂载到场景中的空 GameObject - 点击 Play
- Console 应依次输出:
1
2[Main] ✅ 热更流程完整执行成功
[HotUpdate] 热更代码执行成功!版本: v1.0
⚠️ **如果报错 “Unable to load assembly”**:确认 HybridCLR Settings 中已添加
HotUpdate,且重新执行了 HybridCLR → Installer。
🌐 第六步:真机远程更新流程
服务器准备
1 | # 在服务器上创建资源目录 |
Nginx 配置静态资源服务
1 | location /hotupdate/ { |
Addressables Remote Catalog 配置
- Window → Asset Management → Addressables → Profiles
- 编辑当前 Profile,修改 Remote.BuildPath 和 Remote.LoadPath:
- Remote.BuildPath:
ServerData/StandaloneWindows64 - Remote.LoadPath:
http://你的服务器IP/hotupdate/ServerData/StandaloneWindows64
- Remote.BuildPath:
- 重新执行 Build → New Build → Default Build Script
- 打包真机 Player,运行后会自动从远程拉取最新 DLL
❓ 常见问题速查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| LoadAssetAsync 返回 null | Addressable Name 不匹配 | 检查 Inspector 中的 Addressable Name 是否与代码参数完全一致 |
| Assembly.Load 报 BadImageFormatException | DLL 未正确构建或被裁剪 | 重新执行 HybridCLR → Build → Build Assets |
| 泛型方法调用报 MissingMethodException | AOT 元数据未补充 | 确认调用了 LoadMetadataForAOTAssembly |
| 真机无法下载远程资源 | LoadPath 配置错误或服务器未开放 | 用浏览器直接访问 Remote.LoadPath 验证可达性 |
| 编辑器正常但真机崩溃 | IL2CPP 裁剪了热更引用的类型 | HybridCLR Settings 中开启 Preserve Type Reference |
🗺️ 系列导航
| 篇目 | 状态 |
|---|---|
| ① 概念篇 | ✅ 已发布 |
| ② 环境篇 | ✅ 已发布 |
| ③ Addressables 集成(本篇) | ✅ 已发布 |
| ④ UI 实战篇 | 🔜 下一篇 |
| ⑤ 避坑与优化篇 | 📋 规划中 |
下一篇预告:使用 HybridCLR + Addressables 实现一个完整的热更 UI 系统,包括动态加载面板、资源异步管理、以及热更代码中操作 UGUI 的最佳实践。
说些什么吧!