HybridCLR 教程(六):完整热更新流程与版本管理
前置要求:已完成前5篇教程,项目中 HybridCLR + Addressables 环境可正常进入热更场景。
本篇目标:掌握「改代码 → 打包 → 上传 → 客户端自动拉取」的工业级热更新闭环。
一、为什么需要版本管理?
| 问题 | 没有版本管理的后果 | 版本管理的作用 |
|---|---|---|
| 玩家已缓存旧 dll | 新逻辑不生效 | 通过版本号强制刷新 |
| CDN 文件被浏览器缓存 | 下载到旧资源 | URL 带版本哈希绕过缓存 |
| 回滚需求 | 无法定位历史版本 | 保留多版本快照 |
| A/B 测试 | 所有用户看到相同内容 | 按版本号灰度分发 |
二、整体流程图
1 | [开发者修改代码] |
三、Step-by-Step 实现
3.1 定义版本配置文件
在 Assets 下创建 HotUpdateVersion.asset(ScriptableObject):
1 | using UnityEngine; |
💡 小白提示:右键 Project 窗口 → Create → HybridCLR → HotUpdateVersion 即可创建。
3.2 编辑器脚本:一键构建+写版本
创建 Editor/HybridCLRBuildTool.cs:
1 | using UnityEditor; |
⚠️ 注意:首次使用前需在 Unity 菜单栏执行一次
HybridCLR → Generate → All。
3.3 客户端更新检测器
创建 Runtime/HotUpdateChecker.cs:
1 | using UnityEngine; |
🔧 生产环境建议:使用 Addressables 的
UpdateCatalogs()API 替代手动下载,它会自动处理依赖和增量更新。
四、CDN / OSS 部署规范
目录结构示例
1 | hotupdate/ |
Nginx 配置要点
1 | location /hotupdate/ { |
五、常见踩坑与解决方案
| 现象 | 原因 | 解决 |
|---|---|---|
| 客户端仍用旧 dll | CDN 缓存了旧 version.txt | 给 version.txt 加 ?t=timestamp 或设 no-cache |
| 下载后崩溃 | dll 与主工程 API 不兼容 | 确保 Generate/All 在每次主工程变更后重新执行 |
| iOS 审核被拒 | 热更 dll 被视为动态代码 | 使用 HybridCLR 官方推荐的 App Store 合规方案 |
| 版本比对错误 | 字符串比较 “1.10.0” < “1.9.0” | 必须用 System.Version.Parse() |
六、验证清单
- 修改热更代码后 F9 构建,version.txt 版本号递增
- 上传至 CDN 后,浏览器直接访问 version.txt 显示最新内容
- 客户端清除缓存后启动,日志显示”发现新版本”
- 第二次启动无网络时,能正常使用上次下载的资源
- 回滚到旧版本目录,客户端正确降级
七、下一篇预告
第7篇:HybridCLR 性能优化与内存管理
我们将深入分析热更代码的 GC 行为、IL2CPP 元数据裁剪策略,以及如何避免热更模块导致的帧率抖动。
系列导航
← 第5篇:常见陷阱与调试技巧
第7篇:性能优化与内存管理 →(待更新)
说些什么吧!