Unity + HybirdCLR热更新 入门篇

article/2025/6/25 17:18:58

官方文档

HybridCLR | HybridCLRhttps://hybridclr.doc.code-philosophy.com/docs/intro

什么是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,表示热更新代码生效了

至此完成热更新体验!!!


http://www.hkcw.cn/article/TudPwXIJem.shtml

相关文章

Python基础:人生重开模拟器(小游戏)

引言 手把手带你速通Python 实现人生重开模拟器&#xff08;小游戏&#xff09;的意义&#xff1a;增强对条件语句&#xff0c;循环语句的运用&#xff0c;增加写代码的乐趣。 一、 游戏介绍 网页版的人生重开模拟器&#xff1a; 人生重开模拟器-重来-重启 (aizhancloud.cn) …

【Elasticsearch】ILM(Index Lifecycle Management)策略详解

ILM&#xff08;Index Lifecycle Management&#xff09;策略详解 1.什么是 ILM 策略&#xff1f;2.ILM 解决的核心业务问题3.ILM 生命周期阶段3.1 Hot&#xff08;热阶段&#xff09;3.2 Warm&#xff08;温阶段&#xff09;3.3 Cold&#xff08;冷阶段&#xff09;3.4 Delete…

【存储基础】数据存储基础知识

文章目录 1. 概述&#xff1a;数据存储基础知识2. 存储物理介质3. 数据存储的分类3.1按存储架构分类DAS 直连存储SAN 存储区域网络NAS 网络附加存储分布式存储四种架构之间的核心区别 3.2 按数据模型分类块存储文件存储对象存储 4. 数据存储的关键技术方案和核心机制冗余与容错…

【Part 3 Unity VR眼镜端播放器开发与优化】第二节|VR眼镜端的开发适配与交互设计

文章目录 《VR 360全景视频开发》专栏Part 3&#xff5c;Unity VR眼镜端播放器开发与优化第一节&#xff5c;基于Unity的360全景视频播放实现方案第二节&#xff5c;VR眼镜端的开发适配与交互设计一、Unity XR开发环境与设备适配1.1 启用XR Plugin Management1.2 配置OpenXR与平…

小米YU7还有5款颜色即将发布 更多色彩敬请期待

6月1日,小米在5月22日的发布会上公布了YU7的四款颜色:钛金属色、宝石绿、熔岩橙和寒武岩灰。官方透露,除了这四款已发布的颜色外,还有五款新颜色即将推出,每一种都设计得非常经典。回顾之前的小米SU7,在刚推出时就提供了9种颜色选择,涵盖了跑车色系、时尚色系、豪华色系…

老人被甩客执法人员送其回家 温情护送获赠枇杷

日前,重庆交通执法总队轨道交通支队三大队在重庆西站巡查时发现一名老人误乘“黑车”。考虑到她年近九旬行动不便,执法人员开车将其安全护送回家。老人感激地拿出自己种的枇杷送给执法人员以示感谢。5月27日上午,执法人员在巡查过程中发现一辆渝A籍车辆正在下客,随即上前检…

2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全

2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全 本文面向对 macOS 环境和终端操作尚不熟悉的“小白”用户。我们将从最基础的概念讲起&#xff0c;结合实际操作步骤&#xff0c;帮助你在 2025 年最新 MacBook Pro&#xff08;搭载苹果 M 系列芯片&#xff09;的环境…

女子多次上门骚扰邻居 持刀砍门引发恐慌

近日,辽宁大连有网友发布视频称,疑似患有精神疾病的邻居多次持刀上门砍其家门。当事人刘女士向媒体透露,楼下60多岁的邻居自去年10月搬家入住后,就反复上门找事,声称刘女士一家是脑控组织,想要入侵她的大脑。刘女士表示自己是外地人,去年刚搬进来,为方便孩子上学才购买…

遥控器竟牵出10亿元大案 数据篡改揭秘

涉及河南、四川、浙江等16省市,涉案交易金额达10.3亿元的合同诈骗案成功告破。内蒙古自治区鄂尔多斯市杭锦旗警方通过流量计调节流量和篡改数据的方式,将27名犯罪嫌疑人全部抓获。2024年3月,一封匿名举报信揭露了某石油工程有限公司通过更改流量计数据窃取国家能源的行为。杭…

弗朗西斯卡说樊振东加盟像做梦一样 莫大荣耀与期待

6月2日,据外媒报道,队长弗朗西斯卡在接受采访时谈到夺冠以及樊振东加盟表示:“感觉像做梦一样,樊振东加盟是我们莫大的荣耀。”决赛周末俱乐部宣布了轰动消息,奥运冠军兼前世界冠军樊振东将代表球队出战全部三项赛事。对于下赛季谁能击败他们的问题,弗朗西斯卡表示这取决…

董宇辉在陕西汉江赛龙舟夺冠 体验传统民俗乐趣

5月31日,陕西安康第25届汉江龙舟节开幕。当日,龙舟方阵展演,龙舟横渡汉江,抢鸭子、摸鲤鱼等传统环节亮相开幕式,节日氛围浓厚。今年有27支队伍600多名选手参加龙舟竞渡比赛。董宇辉现身安康龙舟文化园,与现场市民、游客热情互动,齐喊端午安康。他和团队成员在汉江边进行…

租客退房现垃圾场 下水道都堵了 屋内堆满垃圾几乎无处下脚

山东潍坊一名租客租住半年退房时,房东发现屋内堆满生活垃圾。发布视频的当地民宿工作人员称租客是一名年轻女生,房东已报警。辖区派出所表示正在处理此事。5月31日,抖音实名认证的潍坊潍城区怀夏民宿发布了一段54秒的现场视频,显示屋内一片狼藉,堆满了生活垃圾,几乎无处下…

上迪情侣和一家三口扭打 拍照冲突引发热议

5月31日,有网友发布视频称,在上海迪士尼乐园内一对情侣与一家三口发生冲突并扭打在一起,此事引发广泛关注。视频中可以看到双方在现场互相推搡,周围游客纷纷上前劝阻。据权威人士透露,事件发生在5月31日,地点并非排队区域,而是游客自由拍照的点位。情侣和一家三口因拍照…

北京大兴警方严查炸街摩托 夜查行动见效

大兴公安分局针对南海子公园南环路牡丹园南广场区域夜间改装摩托车聚集扰民问题,开展了专项整治行动。这些非法改装的摩托车不仅存在安全隐患,其巨大的噪音也严重干扰了周边居民的生活。5月30日晚,大兴交通支队旧宫中队在“炸街车”夜间活动高发时段,科学部署警力,采取定点…

AI矢量软件|Illustrator 2025网盘下载与安装教程指南

说起AI&#xff0c;很多人第一印象可能是AI人工智能&#xff0c;是与Python相关。实际上&#xff0c;本文要讲的AI&#xff0c;是Adobe Illustrator的缩写&#xff0c;它是一款基于矢量的图形制作软件&#xff0c;主要应用于插画、包装、印刷出版、书籍排版、动画和网页制作等领…

【Spring】RAG 知识库基础

1. RAG 基础概念 1.1 什么是 RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种将检索技术与人工智能生成技术相结合的混合架构&#xff0c;用于解决大模型时效性限制与幻觉问题 你可以这样理解&#xff1a;RAG 技…

NLP学习路线图(十七):主题模型(LDA)

在浩瀚的文本海洋中航行&#xff0c;人类大脑天然具备发现主题的能力——翻阅几份报纸&#xff0c;我们迅速辨别出"政治"、"体育"、"科技"等板块&#xff1b;浏览社交媒体&#xff0c;我们下意识区分出美食分享、旅行见闻或科技测评。但机器如何…

信息安全管理与评估山东卷无线部分答案

配置解析 配置解析 配置解析 radio 1工作在2.4g频段下 radio 2工作在5.0g频段下 配置解析 station-isolation配置关联在同一个VAP下的用户无法互通,但是可以和其他VAP下关联的用户互通,这里的隔离功能类似于交换的端口隔离功能。 arp-suppression开启该功能后则自动使能ARP…

Netty学习example示例

文章目录 simpleServer端NettyServerNettyServerHandler Client端NettyClientNettyClientHandler tcp&#xff08;粘包和拆包&#xff09;Server端NettyTcpServerNettyTcpServerHandler Client端NettyTcpClientNettyTcpClientHandler protocolcodecCustomMessageDecoderCustomM…

Linux系统精准定位创建句柄的进程

在Linux系统中&#xff0c;可以通过以下方法精准定位创建句柄的进程&#xff1a; &#x1f50d; 一、核心排查命令 ​​lsof 命令​​ ​​查看所有进程的句柄占用​​&#xff1a; lsof | awk {print $1, $2} | sort | uniq -c | sort -nr | head -n 20 ​​输出说明​​&…