1. HybridCLR 是什么?
HybridCLR 是一个 Unity 的热更新方案,它的核心思路是让 IL2CPP 支持运行 C# 反射和动态加载程序集。传统 Unity 使用 IL2CPP 时,所有代码都会被转换成 C++,不支持反射加载外部 DLL。而 HybridCLR 让我们在 IL2CPP 下也能使用热更新,减少因 Unity 版本升级导致的兼容性问题。
2. HybridCLR 依赖项安装
要使用 HybridCLR,首先需要安装一些必要的环境:
Unity 需要安装 IL2CPP 模块
- IL2CPP(Intermediate Language To C++)是 Unity 的脚本后端之一,用于将 C# 代码转换成 C++ 再编译成机器码,提升运行效率。
- 安装方式:
- 在 Unity Hub 里,找到你的 Unity 版本,点击**"Add Modules"**(添加模块)
- 选择 IL2CPP 并安装
Visual Studio 需要安装 C++ 运行模块
- 因为 IL2CPP 会把代码转换成 C++,所以编译时需要 C++ 支持。
- 在 Visual Studio Installer 里,确保以下模块被安装:
- MSVC v143
- Windows 10 SDK
- C++ CMake 工具
- .NET 框架开发工具
3. 导入 HybridCLR 插件
使用 PackageManager 导入插件
- 打开 Unity,点击菜单栏的 Window > Package Manager
- 点击左上角的 + 号,选择 Add package from git URL...
- 输入 HybridCLR 的 GitHub 或者 Gitee 地址(hybridclr_unity: HybridCLR package for unity)
- 等待安装完成
HybridCLR Installer 初始化
- 在 Unity 菜单栏找到 HybridCLR > Installer
- 点击 安装,等待控制台打印出 安装成功
- 安装完成后,HybridCLR 的核心功能就已经导入进来了。
4. 创建热更新程序集
HybridCLR 依赖 两个程序集 来实现热更新:
- 主工程程序集(Unity 主工程):通常是
Assembly-CSharp.dll
,用于加载游戏的主要逻辑。 - 热更新程序集(自定义 DLL):这个是我们要动态加载的 DLL,在 HybridCLR 里用于热更新。
如何创建热更新程序集?
- 在 Unity 里,新建一个 文件夹,比如
HotUpdateScript
- 右键这个文件夹,选择 创建程序集定义文件(Assembly Definition)
- 取个名字,比如
HotUpdate
- 这样,所有
HotUpdateScripts
里的 C# 脚本都会被归类到HotUpdate.dll
这个程序集里,而不会被打包进Assembly-CSharp.dll
。
5. 将热更新程序集添加到 HybridCLR 设置
为了让 HybridCLR 知道我们要热更新的程序集,需要手动配置一下:
- 打开 Unity 的 HybridCLR 配置面板
- 菜单栏找到 HybridCLR > Settings
- 在
HotUpdate Assemblies
里添加HotUpdate.dll
- 这样 HybridCLR 才知道
HotUpdate.dll
是我们要动态加载的程序集。
- 这样 HybridCLR 才知道
6. 设置 IL2CPP 后端
HybridCLR 依赖 IL2CPP 运行,所以我们需要手动设置 Unity 的后端:
- 打开 Unity 的 Build Settings(构建设置)
- 选择你的平台(Android / iOS / Windows)
- 在 Player Settings(播放器设置)里:
- Script Backend 改为 IL2CPP
- API Compatibility Level 改为 .NET Framework
7. 打包并测试 HybridCLR 热更新
至此,HybridCLR 的基础配置已经完成,可以尝试运行了:
-
先构建 AOT 元数据
- 运行
HybridCLR > Generate AOT Generic Reference
- 这一步的作用是让 IL2CPP 预生成泛型类型,避免运行时崩溃。
- 运行
-
打包热更新 DLL
- 在
HotUpdateScripts
里写一个简单的 C# 脚本,比如:using UnityEngine; public class TestHotUpdate : MonoBehaviour { void Start() { Debug.Log("Hello, HybridCLR 热更新成功!"); } }
- 编译生成
HotUpdate.dll
- 放到
StreamingAssets
目录,运行时从外部加载
- 在
-
运行游戏,看日志输出
- 如果看到
Hello, HybridCLR 热更新成功!
说明 HybridCLR 运行成功了!
- 如果看到
8. HybridCLR 的原理(简化版)
HybridCLR 的核心原理可以用以下几步理解:
- IL2CPP 默认不支持反射加载 DLL,所以普通的热更新方案(如 XLua)在 IL2CPP 下不能直接用。
- HybridCLR 修改了 IL2CPP 运行时,让它可以加载 C# DLL,这样
HotUpdate.dll
就能被动态加载,而不需要重新打包整个游戏。 - HybridCLR 还支持泛型裁剪,避免 IL2CPP 剔除泛型类型,减少运行时崩溃。