本文假設(shè)你已經(jīng)通過UPM導(dǎo)入了HybridCLR、Addressables、il2cpp支持并具有一定的C#基礎(chǔ)和Unity編輯器操作能力。
熱更程序集
由于本文主打快速集成,故將Assembly-CSharp劃入到熱更新DLL。理論上成熟的項目應(yīng)該用Assembly Definition進行精細劃分以便于管理和縮短編譯時間。但是若掌握不好,劃分不明白,可能會出現(xiàn)交叉引用導(dǎo)致反射機制原地GG。
有關(guān)Assembly Definition,請見官方文檔。
Unity - Manual: Assembly definitions
打開Project Settings, 找到Hybrid Settings,手動將Assembly-CSharp添加到熱更新DLL范圍內(nèi)。
如果你有Assembly Definition,也請?zhí)砑拥郊t框上方的屬性中。請注意,熱更新Assembly Definition和熱更新dlls屬于“并且”關(guān)系,不能存在相同項。
比如你把Assembly Definition的名寫到了底下熱更新dlls里頭了,然后上面熱更新Assembly Definition那里你還把你剛才手動填名字的Assembly Definition給拖進去了。
另起一個熱更入口程序集和場景
由于Assembly-CSharp為熱更新DLL,那么客戶端拉取熱更資源的邏輯就不能放在Assembly-CSharp,否則反射機制不起作用,還帶來報錯。
在這個程序集的同級目錄或者子級目錄起一個熱更入口腳本,具體怎么拉Addressables更新這里就省略了,加載熱更DLL的邏輯可參考如下:
/// <summary>
/// 加載熱更的DLL
/// </summary>
IEnumerator LoadHotfixDLLs()
{
#if !UNITY_EDITOR
// 讀取的熱更dll
var hotFixDllLabelHandle = Addressables.LoadAssetsAsync<TextAsset>("HotUpdateDLL", null);
yield return hotFixDllLabelHandle;
var hotFixDlls = hotFixDllLabelHandle.Result;
Addressables.Release(hotFixDllLabelHandle);
// 加載獲得的dll
foreach (var hotFixDll in hotFixDlls) {
Assembly.Load(hotFixDll.bytes);
}
Debug.Log("[HotUpdater] LoadHotfixDLLs complete!");
#endif
yield return null;
}
/// <summary>
/// 加載aot的DLL
/// </summary>
/// <returns></returns>
IEnumerator LoadMetadataForAOTDLLs()
{
#if !UNITY_EDITOR
HomologousImageMode mode = HomologousImageMode.SuperSet;
var aotMetadateDllHandle = Addressables.LoadAssetsAsync<TextAsset>("AOTMetadataDLL", null);
yield return aotMetadateDllHandle;
var AOTMetadataDlls = aotMetadateDllHandle.Result;
foreach (var AOTMetadataDll in AOTMetadataDlls)
{
LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(AOTMetadataDll.bytes, mode);
Debug.Log($"[HotUpdater] LoadMetadataForAOTAssembly:{AOTMetadataDll.name}. mode:{mode} ret:{err}");
}
Addressables.Release(aotMetadateDllHandle);
Debug.Log("[HotUpdater] LoadMetadataForAOTDLLs complete!");
#endif
yield return null;
}
IEnumerator EnterGame()
{
yield return LoadMetadataForAOTDLLs();
yield return LoadHotfixDLLs();
Addressables.LoadSceneAsync("MainMenu").Completed += (obj) =>
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log("[HotUpdater] Successfully load into MainMenu.");
}
else
{
Debug.LogError("[HotUpdater] Failed to load MainMenu scene!");
}
};
}
簡而言之就是加載完熱更DLL后和AOT元數(shù)據(jù)DLL后再進入你游戲的主場景(或者說有引用Assembly-CSharp代碼的東西)。
這里筆者假定你的熱更新DLL以及元數(shù)據(jù)DLL在Addressables里各自有標簽,于是全拉出來進行Assembly.Load。
你可能會注意到宏,編輯器環(huán)境下測試是不能讀取熱更DLL的,因為屬于同一個程序集加載了兩遍,浪費不說還帶來問題。
編譯熱更新DLL和AOT元數(shù)據(jù)DLL
元數(shù)據(jù)DLL是個新詞,也是HybridCLR的牛逼之處。用大白話講,那些你引用的System命名空間、Newtonsoft.Json等等這些不需要熱更新的庫都算作AOT元數(shù)據(jù)DLL。
單擊All進行熱更新DLL編譯。
編譯完成后,你的工程文件夾下會有熱更新DLL和元數(shù)據(jù),你可以在Assets文件夾下另起一個存熱更DLL的文件夾,并將圖中文件夾里的內(nèi)容拷貝進去。
有關(guān)元數(shù)據(jù)DLL,不是所有的dll都需要拷貝,你可以看一下你工程里有一個叫AOTGenericReferences,那里有一個表。
但是別回到Unity Editor刷新,Unity會當成程序集導(dǎo)入,你需要改一下后綴名。
將DLL加到Addressables
你可以用Label標簽進行區(qū)分,案例中用的代碼是用label進行區(qū)分和加載。
Addressables系統(tǒng)設(shè)置
勾選Build Remote Catalog,配置Build和Load路徑為Remote
Build Settings設(shè)置
理論上你只需要把熱更入口場景打進去就行,其他都不要。
允許通過HTTP下載(可選)
如果你測試環(huán)境用的網(wǎng)頁服務(wù)器沒有配置HTTPS,那么你需要把這個改成allowed,否則Addressables下載流程可能不會走。文章來源:http://www.zghlxwxcb.cn/news/detail-773424.html
然后走打包流程即可,現(xiàn)在你可以用打包出來的客戶端進行測試了。祝好運!文章來源地址http://www.zghlxwxcb.cn/news/detail-773424.html
到了這里,關(guān)于【Unity實戰(zhàn)】HybridCLR熱更快速集成的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!