Unity + HybirdCLR热更新 入门篇
官方文档
什么是HybirdCLR?
HybridCLR(原名 huatuo)是一个专为 Unity 项目设计的C#热更新解决方案,它通过扩展 IL2CPP 运行时,使其支持动态加载和运行 .NET 程序集(Assembly),从而在保持高性能的同时实现代码热更新能力。
HybridCLR 最初的名字 "huatuo"(华佗) 来源于中国古代名医 华佗 的典故,寓意这个技术能像神医一样为 Unity 项目 "治病"(修复Bug) 和 "强身"(动态更新功能),而无需重新发布版本。后来为了国际化推广,项目改名为 HybridCLR:
Hybrid(混合):代表它结合了 AOT(IL2CPP) + Interpreter(解释执行) 两种模式。
CLR(Common Language Runtime):表明它是 .NET 运行时的一种扩展。
不过,很多资深开发者仍习惯称它为 "huatuo",算是一个有趣的社区梗。现在官方文档和代码库中两者都会提到,但正式名称是 HybridCLR。
核心特点
1、支持热更新
允许在运行时加载新的 .dll(如逻辑代码、修复补丁),无需重新打包或发布应用。
适用于 iOS(由于 Apple 禁止 JIT,传统热更方案如 Lua/ILRuntime 性能较低,而 HybridCLR 能提供更好的性能)。
2、基于 IL2CPP,但支持动态性
IL2CPP 原本是 AOT(提前编译),无法动态加载新代码,HybridCLR 扩展了它的能力,使其支持解释执行新代码。
3、高性能
比纯解释型方案(如 ILRuntime、Lua)更快,因为 HybridCLR 能直接运行编译后的 IL 代码,减少转换开销。
4、兼容性高
支持大部分 C# 语法(包括泛型、反射、async/await 等),比部分热更方案(如 ILRuntime)的限制更少。
5、多平台支持
使用HybridCLR技术的游戏不仅能在Android平台,也能在IOS、Consoles、WebGL等所有il2cpp支持的平台上高效运行。
和其他热更新方案的比较
特性 | xLua | HybridCLR | ILRuntime |
技术 | Lua 脚本 | IL2CPP + 解释器 | 纯 C# 解释执行 |
性能 | ⭐⭐⭐(LuaJIT 优化后较好) | ⭐⭐⭐⭐(接近原生) | ⭐⭐(解释执行较慢) |
iOS 支持 | ✅(解释执行允许) | ✅(扩展 IL2CPP) | ✅(但性能较差) |
学习成本 | 需学 Lua | 直接使用 C# | 直接使用 C#(但有兼容限制) |
适用场景 | 业务逻辑热更 | 高性能需求、全平台热更 | 简单热更,无 iOS 高性能需求 |
HybridCLR 是目前 Unity 热更新方案中 性能最好、兼容性最强 的选择之一,特别适合 iOS 平台 或 对性能要求较高的项目。它弥补了 IL2CPP 无法动态加载代码的缺陷,同时避免了 Lua/ILRuntime 的性能问题,是当前热更新技术的重要突破。
快速上手
1、安装HybridCLR
打开Package Manager,点击左上角加号,点击Add package from git URL...,
然后填入
https://gitee.com/focus-creative-games/hybridclr_unity.git
然后点击Add
打开菜单HybridCLR/Installer...
, 点击安装
按钮进行安装。 耐心等待30s左右,安装完成后会在最后打印 安装成功
日志。
2、创建热更新模块
创建 Assets/HotUpdate
目录
在目录下 右键 Create/Assembly Definition
,创建一个名为HotUpdate
的程序集模块
3、配置HybridCLR
打开菜单 HybridCLR/Settings
, 在Hot Update Assemblies
配置项中添加HotUpdate
程序集,如下图:
4、配置IL2CPP
参考该博客的 使用IL2CPP目录下的操作步骤
Unity Mono与IL2CPP比较-CSDN博客
5、创建热更测试相关脚本
创建ConsoleToScreen.cs
脚本
创建 Assets/ConsoleToScreen.cs
脚本类,这个脚本用于测试,它可以打印日志到屏幕上,方便定位错误。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ConsoleToScreen : MonoBehaviour
{const int maxLines = 50;const int maxLineLength = 120;private string _logStr = "";private readonly List<string> _lines = new List<string>();public int fontSize = 15;void OnEnable() { Application.logMessageReceived += Log; }void OnDisable() { Application.logMessageReceived -= Log; }public void Log(string logString, string stackTrace, LogType type){foreach (var line in logString.Split('\n')){if (line.Length <= maxLineLength){_lines.Add(line);continue;}var lineCount = line.Length / maxLineLength + 1;for (int i = 0; i < lineCount; i++){if ((i + 1) * maxLineLength <= line.Length){_lines.Add(line.Substring(i * maxLineLength, maxLineLength));}else{_lines.Add(line.Substring(i * maxLineLength, line.Length - i * maxLineLength));}}}if (_lines.Count > maxLines){_lines.RemoveRange(0, _lines.Count - maxLines);}_logStr = string.Join("\n", _lines);}void OnGUI(){GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity,new Vector3(Screen.width / 1200.0f, Screen.height / 800.0f, 1.0f));GUI.Label(new Rect(10, 10, 800, 370), _logStr, new GUIStyle() { fontSize = Math.Max(10, fontSize) });}
}
创建主场景
- 创建默认初始场景 main.scene
- 场景中创建一个空GameObject,将ConsoleToScreen挂到上面
- 在
Build Settings
中添加main场景到打包场景列表
创建热更新脚本
创建 Assets/HotUpdate/Hello.cs
文件,代码内容如下
using System.Collections;
using UnityEngine;public class Hello
{public static void Run(){Debug.Log("Hello, HybridCLR");}
}
创建Assets/LoadDll.cs
脚本,然后在main场景中创建一个GameObject对象,挂载LoadDll脚本。
using HybridCLR;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;public class LoadDll : MonoBehaviour
{void Start(){// Editor环境下,HotUpdate.dll.bytes已经被自动加载,不需要加载,重复加载反而会出问题。
#if !UNITY_EDITORAssembly hotUpdateAss = Assembly.Load(File.ReadAllBytes($"{Application.streamingAssetsPath}/HotUpdate.dll.bytes"));
#else// Editor下无需加载,直接查找获得HotUpdate程序集Assembly hotUpdateAss = System.AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "HotUpdate");
#endifType type = hotUpdateAss.GetType("Hello");type.GetMethod("Run").Invoke(null, null);}
}
运行main场景,屏幕上会显示 'Hello,HybridCLR',表示代码工作正常。
6、打包运行
运行菜单 HybridCLR/Generate/All
进行必要的生成操作。这一步不可遗漏!!!
将{项目根目录}/HybridCLRData/HotUpdateDlls/StandaloneWindows64(MacOS下为StandaloneMacXxx)
目录下的HotUpdate.dll复制到Assets/StreamingAssets/HotUpdate.dll.bytes
,注意,要加.bytes
后缀!!!
打开Build Settings
对话框,点击Build And Run
,打包并且运行热更新示例工程。如果打包成功,并且屏幕上显示 'Hello,HybridCLR',表示热更新代码被顺利执行!
7、测试热更新
修改Assets/HotUpdate/Hello.cs
的Run函数中Debug.Log("Hello, HybridCLR");
代码,改成Debug.Log("Hello, World");
。
运行菜单命令HybridCLR/CompileDll/ActiveBulidTarget
重新编译热更新代码。
将{项目根目录}/HybridCLRData/HotUpdateDlls/StandaloneWindows64(MacOS下为StandaloneMacXxx)
目录下的HotUpdate.dll复制替换刚才的打包输出目录的 XXX_Data/StreamingAssets/HotUpdate.dll.bytes
。
重新运行程序,会发现屏幕中显示Hello, World
,表示热更新代码生效了
至此完成热更新体验!!!
相关文章:

Unity + HybirdCLR热更新 入门篇
官方文档 HybridCLR | HybridCLRhttps://hybridclr.doc.code-philosophy.com/docs/intro 什么是HybirdCLR? HybridCLR(原名 huatuo)是一个专为 Unity 项目设计的C#热更新解决方案,它通过扩展 IL2CPP 运行时,使其支持动态加载和…...
QuickBASIC QB64 支持 64 位系统和跨平台Linux/MAC OS
QuickBASIC 的现代继任者 QB64 已发展成为一个功能强大的开源项目,支持 64 位系统和跨平台开发。以下是详细介绍: 项目首页 - QB64pe:The QB64 Phoenix Edition Repository - GitCode https://gitcode.com/gh_mirrors/qb/QB64pe 1. QB64 概述 官网&am…...

ElasticSearch迁移至openGauss
Elasticsearch 作为一种高效的全文搜索引擎,广泛应用于实时搜索、日志分析等场景。而 openGauss,作为一款企业级关系型数据库,强调事务处理与数据一致性。那么,当这两者的应用场景和技术架构发生交集时,如何实现它们之…...

【C语言极简自学笔记】项目开发——扫雷游戏
一、项目概述 1.项目背景 扫雷是一款经典的益智游戏,由于它简单而富有挑战性的玩法深受人们喜爱。在 C 语言学习过程中,开发扫雷游戏是一个非常合适的实践项目,它能够综合运用 C 语言的多种基础知识,如数组、函数、循环、条件判…...
Global Security Markets 第5章知识点总结
一、章节核心内容概述 《Global Securities Markets》第五章聚焦全球主要证券交易所、关联存管机构及跨境交易实务,重点解析“乘客市场(Passenger Markets)”概念与合规风险,同时涵盖交易费用、监管规则等实操要点。考虑到市场的…...
电子电路:4017计数器工作原理解析
4017是CMOS十进制计数器/分频器,它属于CD4000系列,工作电压范围比较宽,可能3V到15V。我记得它有10个译码输出端,每个输出端依次在高电平和低电平之间循环,可能用于时序控制或者LED显示什么的。 4017内部应该由计数器和译码器两部分组成。计数器部分可能是一个约翰逊计数器…...
Vim 中设置插入模式下输入中文
在 Vim 中设置插入模式下输入中文需要配置输入法切换和 Vim 的相关设置。以下是详细步骤: 1. 确保系统已安装中文输入法 在 Linux 系统中,常用的中文输入法有: IBus(推荐):支持拼音、五笔等Fcitx…...
GitHub 趋势日报 (2025年05月31日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 1153 prompt-eng-interactive-tutorial 509 BillionMail 435 ai-agents-for-begin…...

Maven概述,搭建,使用
一.Maven概述 Maven是Apache软件基金会的一个开源项目,是一个有优秀的项目构建(创建)工具,它用来帮助开发者管理项目中的jar,以及jar之间的依赖关系,完成项目的编译,测试,打包和发布等工作. 我在当前学习阶段遇到过的jar文件: MySQL官方提供的JDBC驱动文件,通常命名为mysql-…...
基于大模型的数据库MCP Server设计与实现
基于大模型的数据库MCP Server设计与实现 引言 随着大语言模型(LLM, Large Language Model)能力的不断提升,AI Agent(智能体)正在从简单的对话问答,向更复杂的自动化任务执行和业务流程管理演进。在企业和开发者的实际需求中,数据库操作是最常见、最核心的场景之一。如…...
【前端】macOS 的 Gatekeeper 安全机制阻止你加载 bcrypt_lib.node 文件 如何解决
这个弹窗是 macOS 的 Gatekeeper 安全机制阻止你加载 bcrypt_lib.node 文件,因为它不是 Apple 签名的文件。 你想 “忽视” 它,其实是让系统允许这个 .node 原生模块运行,解决方式如下: sudo xattr -d com.apple.quarantine nod…...

Unity 环境搭建
Unity是一款游戏引擎,可用于开发各种类型的游戏和交互式应用程序。它由Unity Technologies开发,并在多个平台上运行,包括Windows、macOS、Linux、iOS、Android和WebGL。Unity也支持虚拟现实(VR)和增强现实(AR)技术,允许用户构建逼…...
【入门】【练9.3】 加四密码
| 时间限制:C/C 1000MS,其他语言 2000MS 内存限制:C/C 64MB,其他语言 128MB 难度:中等 分数:100 OI排行榜得分:12(0.1*分数2*难度) 出题人:root | 描述 要将 China…...

使用 SASS 与 CSS Grid 实现鼠标悬停动态布局变换效果
最终效果概述 页面为 3x3 的彩色格子网格;当鼠标悬停任意格子,所在的行和列被放大;使用纯 CSS 实现,无需 JavaScript;利用 SASS 的模块能力大幅减少冗余代码。 HTML 结构 我们使用非常基础的结构,9 个 .i…...
Node.js 全栈开发方向常见面试题
Node.js 全栈开发”方向的面试题**,这类岗位通常包括: 后端:Node.js(Express/Nest)、数据库、REST API、安全、部署等 前端:React/Vue(部分可能含 Next.js)、API 调用、状态管理等 …...

Spring如何实现组件扫描与@Component注解原理
Spring如何实现组件扫描与Component注解原理 注解配置与包扫描的实现机制一、概述:什么是注解配置与包扫描?二、处理流程概览三、注解定义ComponentScope 四、核心代码结构1. ClassPathScanningCandidateComponentProvider2. ClassPathBeanDefinitionSca…...
历年四川大学计算机保研上机真题
2025四川大学计算机保研上机真题 2024四川大学计算机保研上机真题 2023四川大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 分数求和 题目描述 有一分数序列: 2 / 1 2/1 2/1, 3 / 2 3/2 3/2, 5 / 3 5/3 5/3, 8 / 5 8/5 8/5, 13 /…...
gcc符号表生成机制
符号表生成机制 我们以C语言的编译链接过程为例,详细讲解符号表(Symbol Table)的流程,涵盖编译和链接两个阶段。理解符号表是理解链接器如何解决符号引用(如函数、变量)的关键。 符号表分为两种ÿ…...

达梦数据库 Windows 系统安装教程
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
unix/linux source 命令,其基本概念、定义、性质、定理
从计算机科学的角度,特别是形式语言、操作系统和编程语言设计的角度来看,source (或 .) 命令虽然看似简单,但其背后也蕴含着一些核心的概念、定义、性质和可以类比的“定理”(或者说,更准确地是“设计原则”或“行为模式”)。 让我们尝试从一个更理论和结构化的视角来剖…...

【Java EE初阶】计算机是如何⼯作的
计算机是如何⼯作的 计算机发展史冯诺依曼体系(Von Neumann Architecture)CPU指令(Instruction)CPU 是如何执行指令的(重点) 操作系统(Operating System)进程(process) 进程 PCB 中的…...

RAG理论基础总结
目录 概念 流程 文档收集和切割 读取文档 转换文档 写入文档 向量转换和存储 搜索请求构建 向量存储工作原理 向量数据库 文档过滤和检索 检索前 检索 检索后 查询增强和关联 QuestionAnswerAdvisor查询增强 高级RAG架构 自纠错 RAG(C-RAG…...

列表推导式(Python)
[表达式 for 变量 in 列表] 注意:in后面不仅可以放列表,还可以放range ()可迭代对象 [表达式 for 变量 in 列表 if 条件]...
嵌入式RTC工作原理及应用场景
20ppm 是衡量 RTC(实时时钟)精度的关键指标,表示 每百万秒(约11.57天)的最大时间误差范围。以下是通俗易懂的解释: 1. ppm 的含义 ppm Parts Per Million(百万分之一) 1 ppm 1/1,…...

一天搞懂深度学习--李宏毅教程笔记
目录 1. Introduction of Deep Learning1.1. Neural Network - A Set of Function1.2. Learning Target - Define the goodness of a function1.3. Learn! - Pick the best functionLocal minimaBackpropagation 2. Tips for Training Deep Neural Network3. Variant of Neural…...
Go语言常见接口设计技巧-《Go语言实战指南》
在 Go 中,接口是连接代码组件的桥梁。合理设计接口可以大幅提升程序的可维护性、可扩展性和测试友好性。本章将分享 Go 开发中常见的接口设计技巧与最佳实践。 一、接口设计原则 1. 面向接口编程,而非面向实现编程 尽量使用接口类型作为函数参数或返回值…...

python打卡训练营打卡记录day43
复习日 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 数据集来源:Flowers Recognition 选择该数据集原因: 中等规模:4242张图片 - 训练快速但足够展示效…...
Camera相机人脸识别系列专题分析之十一:人脸特征检测FFD算法之低功耗libvega_face.so人脸属性(年龄,性别,肤色,微笑,种族等)检测流程详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:Camera相机人脸识别系列专题分析之十:人脸特征检测FFD算法之低功耗libvega_face.so人脸识别检测流程详解 这一篇我们开始讲: Camera相机人脸识别系列专题分析之十一:人脸特征检测FFD算法之低功耗lib…...
解决:输入SSH后,仍无法通过网址登录以及紧接着的新问题Permission denied(publickey,password).
现象: 管理员: Windows PowerShell输入SSH后,仍无法通过网址登录 例如输入你的ssh命令:ssh -CNg -L xxxx:127.0.0.1:xxxx rootaaaaaaaaa.com -p yyyyy 得到终端提示:ssh无法识别为 cmdlet、函数、脚本文件或可运行程序的名称。 解…...

【QT控件】QWidget 常用核心属性介绍 -- 万字详解
目录 一、控件概述 二、QWidget 核心属性 2.1 核心属性概览 2.2 enabled 编辑 2.3 geometry 2.4 windowTitle 2.5 windowIcon 使用qrc文件管理资源 2.6 windowOpacity 2.7 cursor 2.8 font 编辑 2.9 toolTip 2.10 focusPolicy 2.11 styleSheet QT专栏&…...