Unity + HybirdCLR熱更新 入門篇

官方文檔

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.pswp.cn/pingmian/83277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83277.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

類 Excel 數據填報

類 Excel 填報模式&#xff0c;滿足用戶 Excel 使用習慣 數據填報&#xff0c;可作為獨立的功能模塊&#xff0c;用于管理業務流程、匯總采集數據&#xff0c;以及開發各類數據報送系統&#xff0c;因此&#xff0c;對于報表工具而言&#xff0c;其典型場景之一就是利用報表模…

MySQL 8.0 OCP 英文題庫解析(十)

Oracle 為慶祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免費考取原價245美元的MySQL OCP 認證。 從今天開始&#xff0c;將英文題庫免費公布出來&#xff0c;并進行解析&#xff0c;幫助大家在一個月之內輕松通過OCP認證。 本期公布試題81~90 試題81:…

JavaScript 性能優化實戰:從原理到框架的全棧優化指南

在 Web 應用復雜度指數級增長的今天&#xff0c;JavaScript 性能優化已成為衡量前端工程質量的核心指標。本文將結合現代瀏覽器引擎特性與一線大廠實踐經驗&#xff0c;構建從基礎原理到框架定制的完整優化體系&#xff0c;助你打造高性能 Web 應用。 一、性能優化基礎&#x…

基于Web的分布式圖集管理系統架構設計與實踐

引言&#xff1a;為什么需要分布式圖集管理&#xff1f; 在現代Web圖形應用中&#xff0c;紋理圖集&#xff08;Texture Atlas&#xff09;技術是優化渲染性能的關鍵手段。傳統的圖集制作流程通常需要美術人員使用專業工具&#xff08;如TexturePacker&#xff09;離線制作&am…

鴻蒙OS在UniApp中集成Three.js:打造跨平臺3D可視化應用#三方框架 #Uniapp

在UniApp中集成Three.js&#xff1a;打造跨平臺3D可視化應用 引言 在最近的一個項目中&#xff0c;我們需要在UniApp應用中展示3D模型&#xff0c;并實現實時交互功能。經過技術選型和實踐&#xff0c;我們選擇了Three.js作為3D渲染引擎。本文將分享我們在UniApp中集成Three.…

Flask中關于app.url_map屬性的用法

目錄 一、app.url_map 是什么? 二、可以查看哪些信息? 三、示例:打印所有路由 四、結合 url_for() 使用 五、常見用途場景 六、結合 Flask CLI 使用 總結 app.url_map 是 Flask 中非常重要的一個屬性,用于查看或操作整個應用的 URL 路由映射表(routing map)。它展…

SpringBoot項目搭建指南

SpringBoot項目搭建指南 文章目錄 SpringBoot項目搭建指南一、SpringBoot項目搭建1.1 SpringBoot 版本選擇1.2 SpringBoot 框架引入方式1.2.1 繼承 Starter Parent POM1.2.2 不使用 Parent POM 來使用 Spring Boot 1.3 SpringBoot 打包插件 二、日志框架引入2.1 引入SpringBoot…

數據庫系統概論(十六)數據庫安全性(安全標準,控制,視圖機制,審計與數據加密)

數據庫系統概論&#xff08;十六&#xff09;數據庫安全性 前言一、數據庫安全性1. 什么是數據庫安全性&#xff1f;2. 為何會存在安全問題&#xff1f; 二、安全標準的發展1. 早期的“開拓者”&#xff1a;TCSEC標準2. 走向國際統一&#xff1a;CC標準3. TCSEC和CC標準有什么不…

Jvm 元空間大小分配原則

JVM元空間&#xff08;Metaspace&#xff09;的大小分配原則與系統物理內存密切相關&#xff0c;但并不是直接等比例分配&#xff0c;而是通過一系列參數和JVM的動態管理機制來確定。下面從原理和實際行為兩方面詳細說明&#xff1a; 1. 元空間&#xff08;Metaspace&#xff0…

編程之巔:語言的較量

第一章&#xff1a;代碼之城的召集令 在遙遠的數字大陸上&#xff0c;有一座名為“代碼之城”的神秘都市。這里居住著各種編程語言的化身&#xff0c;他們以擬人化的形態生活&#xff0c;每種語言都有獨特的性格與技能。Python是個優雅的學者&#xff0c;C是個硬核戰士&#x…

飛牛fnNAS裝機之迷你小主機的利舊

前幾天找Console線的時候,翻出一臺迷你小主機,想起來以前是做“軟路由”用的,現在用不上了。本想放回箱子,但突然想起最近正在做飛牛NAS的專題,不如將其改造成NAS得了。 這個東東有HDMI、VGA接口,2個USB(其中一個支持3.0),還有4個網口。 打開機蓋,看看內部情況。發現…

uv:一個現代化的 Python 依賴管理工具

在 Python 的生態系統中&#xff0c;依賴管理和 Python 版本管理一直是開發者關注的核心問題。傳統的工具如 pip、poetry 和 pyenv 雖然功能強大&#xff0c;但在性能和使用體驗上仍有改進空間。uv 是由 Python 核心開發者開發的 現代化依賴管理工具&#xff0c;旨在提供更快、…

ubuntu 22.04安裝k8s高可用集群

文章目錄 1.環境準備&#xff08;所有節點&#xff09;1.1 關閉無用服務1.2 環境和網絡1.3 apt源1.4 系統優化1.5 安裝nfs客戶端 2. 裝containerd&#xff08;所有節點&#xff09;3. master的高可用方案&#xff08;master上操作&#xff09;3.1 安裝以及配置haproxy&#xff…

PnP(Perspective-n-Point)算法 | 用于求解已知n個3D點及其對應2D投影點的相機位姿

什么是PnP算法&#xff1f; PnP 全稱是 Perspective-n-Point&#xff0c;中文叫“n點透視問題”。它的目標是&#xff1a; 已知一些空間中已知3D點的位置&#xff08;世界坐標&#xff09;和它們對應的2D圖像像素坐標&#xff0c;求解攝像機的姿態&#xff08;位置和平移&…

QT-JSON

#include <QJsonDocument>#include <QJsonObject>#include <QJsonArray>#include <QFile>#include <QDebug>void createJsonFile() {// 創建一個JSON對象 鍵值對QJsonObject jsonObj;jsonObj["name"] "John Doe";jsonObj[…

解決各個系統報錯TDengine:no taos in java.library.path問題

windows 系統解決辦法 在本地上安裝一個TD的Windows客戶端&#xff0c;注意安裝的客戶端版本一定要和服務端TD版本完全一致。&#xff08;或者將 C:\TDengine\driver\taos.dll 拷貝到 C:\Windows\System32\ 目錄下&#xff09; 客戶端各個歷史版本下載鏈接&#xff1a;TDengin…

我提出結構學習的思路,意圖用結構學習代替機器學習

我提出結構學習的思路&#xff0c;意圖用結構學習代替機器學習 1.機器學習的本質和缺點 機器學習的規律是設計算法、用數據訓練算法、讓算法學會產生正確的數據回答問題&#xff0c;其缺點在于&#xff0c;需要大規模訓練數據和巨大算力還其次&#xff0c;機器學習不能產生智…

【Hive 運維實戰】一鍵管理 Hive 服務:Metastore 與 HiveServer2 控制腳本開發與實踐

一、引言 在大數據開發中&#xff0c;Hive 作為重要的數據倉庫工具&#xff0c;其核心服務metastore&#xff08;元數據服務&#xff09;和hiveserver2&#xff08;查詢服務&#xff09;的啟停管理是日常運維的基礎操作。手動執行命令啟停服務不僅效率低下&#xff0c;還容易因…

簡歷制作要精而不簡

不得不說&#xff0c;不管是春招&#xff0c;還是秋招&#xff0c;我們在求職時&#xff0c;第一步便是制作一份簡歷。不得不承認&#xff0c;好的簡歷&#xff0c;就像一塊敲門磚&#xff0c;能讓面試官眼前一亮&#xff0c;讓應聘成功的概率增添一分。 對于一個初次求職者來…

深入Java8-日期時間API:TemporalQuery、TemporalQueries類

JDK版本&#xff1a;11 TemporalQuery FunctionalInterface public interface TemporalQuery<R> {R queryFrom(TemporalAccessor temporal); } emporalQuery是Java 8中用于時間查詢的一個函數式接口&#xff0c;它允許用戶對日期和時間進行查詢。TemporalQuery接口中定…