摘要
本篇博客詳細介紹了我基于 HybridCLR 與 AR Foundation 的 Unity AR 開發插件,旨在為開發者提供高效的跨平臺熱更新方案。文章從背景與動機出發,覆蓋一鍵安裝工具、環境配置、熱更新數據制作與示例程序運行等核心模塊,并展示代碼結構與使用指南。文末說明項目已歸檔不再維護,歡迎 Fork 與二次開發。
倉庫地址:EQ-MR-For-Unity
https://github.com/eqgis/EQ-MR-For-Unity
本項目于 2024 年 5 月完成最后一次維護,為穩定歸檔版本,不再接受更新或修復。如需新功能或定制化需求,請自行 Fork 并開發。
引言
在增強現實(AR)技術快速發展的大背景下,Unity 已成為移動端 AR 應用的首選引擎。然而,隨著項目規模擴大與功能復雜度提升,傳統的“全量構建+發布”流程已難以滿足快速迭代與熱修復需求:每次更改都需要長時間的 AOT 編譯與打包,影響開發效率。為此,我基于 HybridCLR 和 AR Foundation,打造了一款支持熱更新的 Unity AR 開發插件(以下簡稱“本插件”),讓 AR 場景內容與邏輯的更新更輕量、更靈活。
一、插件背景與動機
-
提升迭代效率
Unity 在 IL2CPP 模式下的 AOT 編譯與打包環節耗時驚人,尤其是大型項目常需數分鐘至十幾分鐘。通過 HybridCLR,我們可將游戲核心邏輯與示例功能打包為可熱更新的 Assembly,只在需要時更新對應 DLL,極大縮短迭代周期。 -
跨平臺一致性
HybridCLR 擴展了 IL2CPP,使其從純 AOT Runtime 轉變為 AOT + Interpreter 混合模式,原生支持動態加載 Assembly。它在 iOS、Android 及其他平臺(如主機)上都能以 AOT+Interpreter 模式高效執行,為跨平臺 AR 應用熱更新提供統一方案。 -
內容驅動開發
AR 應用核心在于場景與資源內容的豐富與優化。本插件將 AR 場景、模型及邏輯統一封裝為可熱更新資源,允許動態下發與版本管理,縮減客戶端包體積,提升用戶體驗。
二、功能概覽
- 一鍵安裝工具:集成 EnvInstaller,一鍵導入 AR Foundation、ARCore Extension、HybridCLR 相關 Package;
- 開發環境配置:通過插件設置與 Unity Project/Player Settings 快速完成 ARCore 與 HybridCLR 所需配置;
- 熱更新數據制作:提供 “BuildBundle-Android” 導出流程,將 AR 場景打包為熱更新數據(ZIP + version 文件);
- 示例程序運行:包含 AR 圖片識別場景示例與動態場景示例,展示如何加載熱更新數據并進入入口場景;
- 動態加載邏輯:核心組件 DataDownLoader、DllLoader 與 HotFixDataMgr,分別負責數據下載、DLL 加載與入口場景切換;
- 靈活擴展接口:Expose DetectCallback 等回調機制,可自定義圖片識別、場景交互與資源加載邏輯;
- 歸檔開源:當前版本為穩定歸檔版,不再維護,歡迎社區 Fork 與二次開發。
三、技術架構與核心模塊
3.1 一鍵安裝環境
- EnvInstaller 插件:在導入后新增 “Installer” 菜單,提供 “Install ARCore” 與 “Install HybridCLR” 兩個選項,自動添加所需 Package 與依賴。
- ARCore(XR Foundation):EnvInstaller 會導入 AR Foundation 與 ARCore Extensions,簡化手動導入流程。
- HybridCLR:EnvInstaller 包含 HybridCLR package,執行兩步 “Install” 操作后,自動替換 libil2cpp 并啟用混合運行時。
3.2 開發環境配置
-
導入 AR SDK
通過Assets -> Import Package -> Custom Package…
導入AR SDK_v1.0.1.x.unitypackage
,激活菜單 “Holo-XR > Settings”,勾選“熱更新”和“ARCore”。 -
Project/Player Settings 調整
- Graphics API:取消 Auto Graphics API,移除 Vulkan;
- Minimum API Level:設為 Android 7.0 (API Level 24) 或以上;
- Scripting Backend:選擇 IL2CPP,API Level 切換為 .NET Framework(Unity 2021+)或 .NET 4.x(Unity ≤2020)。
-
XR Plug-in Management
在 Project Settings > XR Plug-in Management 中啟用 ARCore,并在 ARCore 菜單設置深度可選。 -
HybridCLR Settings
- 打開菜單
HybridCLR > Installer…
,確保 Installed 狀態為 True; - 在
HybridCLR > Settings
中,將示例程序集(Holo.Demo、DynamicScene)添加到hotUpdateAssemblies
或hotUpdateAssemblyDefinitions
; - 配置 “Patch AOT Assemblies”,添加需要補充元數據的 DLL 列表(UnityEngine.AndroidJNIModule.dll、UnityEngine.CoreModule.dll、mscorlib.dll)。
- 打開菜單
3.3 熱更新數據制作
-
場景配置
- 在
ARCore Session
對象上添加ARCoreImageDetect
組件,配置待識別的圖像集合及對應 Prefab; - 自定義繼承
DetectCallback
,重寫OnAdded
、OnUpdate
、OnRemoved
回調,實現識別事件邏輯。
- 在
-
導出熱更數據
在菜單Holo-XR -> BuildBundle-Android
中,選擇入口場景,點擊“導出”,生成 ZIP 包與version
文件,作為熱更數據。
3.4 示例程序運行
- 程序集劃分
在HybridCLR Settings
中完成示例程序集劃分與元數據補充。 - 場景與打包
打開示例場景/Assets/Scenes/AOT/Scene_AOT_2.unity
,在 Build Settings 中添加場景并運行 Build or Build And Run。 - 關鍵組件
- DataDownLoader:負責版本校驗與熱更數據下載,提供
StartDownload()
方法、OnProgressUpdate
、OnError
回調; - DllLoader:讀取熱更 Assembly 與 AB包,提供
StartReadData()
與getEntrance()
方法; - HotFixDataMgr:管理下載與加載流程,提供
StartGame()
與UpdateData()
,并在Awake()
中注冊錯誤與進度事件。
- DataDownLoader:負責版本校驗與熱更數據下載,提供
四、代碼結構與倉庫布局
/Assets/EditorEnvInstaller_vX.X/HoloXR/ScriptsDataDownLoader.csDllLoader.csHotFixDataMgr.csDetectCallback.cs/SettingsARCoreSettings.assetHybridCLRSettings.asset/ScenesAOT/Scene_AOT_2.unityHotUpdate/Scene_Example.unity/Resources/HotUpdateData
/HybridCLRDataAssembliesPostIl2CppStrip/{platform}
/BuildScriptsbuild_android.bat
LICENSE.md
README.md
- Assets/HoloXR:核心腳本與資源;
- Assets/Editor/EnvInstaller:EnvInstaller 插件源代碼;
- BuildScripts:一鍵打包腳本,可調整 SDK 版本與輸出路徑;
- HybridCLRData:AOT 裁剪后 DLL 與元數據文件;
- README.md:項目介紹、快速開始與使用指南;
- LICENSE.md:MIT 開源協議。
五、使用指南
- Clone 倉庫:
git clone https://github.com/YourRepo/Unity-AR-Plugin-Archived.git
- 打開 Unity 項目,執行
Assets -> Import Package -> Custom Package…
導入 EnvInstaller 與 AR SDK; - 在
Holo-XR > Settings
中啟用熱更新與 ARCore; - 調整 Project/Player Settings 后,點擊
Installer -> Install ARCore
、Installer -> Install HybridCLR
; - 導入 AR SDK Package,并在
Holo-XR -> BuildBundle-Android
導出示例熱更數據; - 在示例場景中運行,或在自定義場景下調用
HotFixDataMgr
的方法加載熱更內容。
六、貢獻與二次開發
本倉庫已“歸檔”且不再維護,歡迎社區 Fork 后:
- 修復 Issue;
- 優化打包與生成流程;
- 支持更多 AR 平臺(ARKit、Magic Leap 等);
- 集成其他熱更新方案(如 ILRuntime)。
請參考 CONTRIBUTING.md
提交 PR,并在 Issue 中描述具體需求或改進建議。
七、歸檔說明
倉庫地址:EQ-MR-For-Unity
本項目于 2024 年 5 月完成最后一次維護,為穩定歸檔版本,不再接受更新或修復。如需新功能或定制化需求,請自行 Fork 并開發。
v1.0.2 Latest
Runtime:
-接入ARCore,新增功能如下:
1、支持通過圖像識別實現新載入場景進行重定位
Editor:
1、新增Installer部分(用于預先安裝依賴項)
其它:
1、更新與Android 原生交互部分所依賴的aar
2、完善程序集版本定義
May 9, 2024
v1.0.1
Runtime:
-接入ARCore,新增功能如下:
1、接入ARFoudation中所有功能
1、支持在熱更程序集中使用AR增強圖像的功能
2、支持使用ARCore采集點云數據
3、支持“通過圖片識別的方式動態加載場景”的功能
-更新AndroidPlugin下aar
Editor:
1、支持一鍵導入ARFoundation
1、支持導入"*.pts"格式的點云數據
2、完善熱更數據打包工具
Demo:
1、新增“AR動態場景”的示例
2、新增“點云采集”的示例
BUG:
1、解決熱更數據重復加載的報錯
2、解決使用Editor導出場景時偶爾報錯的問題
v0.1.2
Sep 14, 2023
通用功能:
1、支持語音喚醒、語音識別、語音合成
2、提供語音助手(“VoiceAssistant”)
3、支持調用Eqgis的后臺語音服務(參考“VoiceAssistantService”)
Unity編輯器:
1、支持在層級菜單中添加語音助手(“VoiceAssistant”)
示例:
1、語音服務調用示例(Holo/Demo/Speech/語音服務.unity)
2、思必馳語音助手使用示例(Holo/Demo/Speech/AiSpeech.unity)
備注:當前版本需要使用speech-plugin-1.0.6.aar
v0.1.1
Aug 24, 2023
MR平臺:
-接入XVisio 設備,新增功能如下:
1、支持CSlamMapLoader加載在線homap數據
通用功能:
1、支持自動校驗本地數據版本與服務器數據版本
2、支持根據服務器地址自動進行數據熱更
3、數據熱更時添加進度監聽事件
Unity編輯器:
1、支持“*.homap”數據通過網絡路徑導入
2、支持對生成的熱更數據進行加密
示例:
1、新增XVisio設備的熱更示例
v0.1.0
Aug 15, 2023
MR平臺:
-接入XVisio 設備,新增功能如下:
1、引入AprilTag識別
2、支持場景掃描,并將掃描結果保存為“*.homap”
3、支持根據“ *.homap”恢復場景
4、支持MR場景與MR場景之間的跳轉
Unity編輯器:
1、新增Xvisio平臺默認配置導入
2、支持“*.homap”數據從本地文件路徑導入
3、支持安卓平臺的場景資源以及C#腳本打包
資源內容:
1、引入用于實現遮擋的材質文件
八、未來規劃
提示:本倉庫已停止維護,后續不會有更新。建議有意向的開發者參考或二次開發,貢獻社區力量。
結語
本插件旨在為 Unity AR 開發者提供一站式熱更新解決方案,結合 HybridCLR 與 AR Foundation,實現跨平臺、快速迭代的 AR 應用交付。雖然項目已歸檔,但其設計思路與核心模塊對類似需求或許有借鑒意義。期待社區同學發揚開源精神,在此基礎上持續創新,推動XR技術的發展!
BTW,
分享一下另一個開源倉庫Sceneform-EQR
Sceneform-EQR 是對谷歌“sceneform-android-sdk”的擴展,適用于圖形和視頻,以及增強現實(AR)和虛擬現實(VR)相關領域。目前集成了 ARCore、AREngine 和 ORB-SLAM3,提供多種場景選項,包括 AR 場景、VR 場景和自定義背景場景,以滿足不同的原生三維開發需求。