Unity热更新-HybirdCLR + Addressable 一
1、开发准备环境
HybridCLR支持Unity 2019-2022的所有LTS版本,我采用的是2021.3.5,unity的安装以及visual studio的安装这里就不多介绍了
2、创建一个Unity的空项目
命名为HybirdAA,接着创建两个场景Entry、MainScene,Entry作为启动场景,分别在Entry场景里添加一个Image和Text,进行图片颜色和Text内容修改,两个场景有区别即可
3、安装HybridCLR
主菜单中点击Windows/Package Manager打开包管理器。如下图所示点击Add package from git URL…,填入https://gitee.com/focus-creative-games/hybridclr_unity.git或https://github.com/focus-creative-games/hybridclr_unity.git
一般推荐使用gitee的地址,github下载经常会失败,也可以先把 com.code-philosophy.hybridclr clone或者下载到本地,将文件夹改名为com.code-philosophy.hybridclr,直接移动到项目的Packages目录下
4、初始化热更新模块
打开菜单HybridCLR/Installer…, 点击安装按钮进行安装。 等待一会,安装完成会显示版本号,如下图所示
5、创建 HotFix 热更新模块
1、创建 Assets/HotFix目录
2、如果你们的项目把Assembly-CSharp作为AOT程序集,在目录下 右键 Create/Assembly Definition,创建一个名为HotFix的程序集模块,建议关闭热更新程序集的auto reference选项。因为Assembly-CSharp是最顶层assembly,开启此选项后会自动引用剩余所有assembly,包括热更新程序集,很容易就出现失误引用热更新程序集导致打包失败的情况
3、在HotFix文件夹里创建一个App.cs文件备用
6、配置HybridCLR
打开菜单 HybridCLR/Settings, 在Hot Update Assemblies配置项中添加HotFix程序集,如下图:
7、配置PlayerSettings
1、如果你用的hybridclr包低于v4.0.0版本,需要关闭增量式GC(Use Incremental GC) 选项
2、Scripting Backend 切换为 IL2CPP
3、Api Compatability Level 切换为 .Net 4.x(Unity 2019-2020) 或 .Net Framework(Unity 2021+)
4、生成AOT所需要的文件,打开菜单HybirdCLR/Generate/All, 耐心等待一会,执行完成会在Assets同级目录HybridCLRData文件夹多出的内容如下:
8、安装Addressable
打开菜单Window/PackageManager, 筛选为Unity Rigistry,并搜索Addressables,点击install 即可
9、创建可寻址资源组
1、打开菜单Window/Asset Management/Addressable/Groups ,在弹出的窗口里点击Create Addressables Settings 创建界面如下
2、在Assets 目录下创建文件夹AddressableAssets, 用于存在热更资源,接着在AddressableAssets文件夹里创建Scenes、HotFixDlls文件夹,并把上面创建的两个场景,放在Scenes里,此时在此工程目录找到HybridCLRData/HotUpdateDlls/StandaloneWindows64/HotFix.dll,并拷贝到HotFixDlls里,改名为HotFix.dll.bytes,补充AOT元素也需要拷贝到HotFixDlls文件夹里,补充元素目录为HybridCLRData/AssembliesPostIl2CppStrip/StandaloneWindows64/mscorlib.dll、System.Core.dll、System.dll,同样需要在后缀加上.bytes,不然Unity识别不了,如下图
3、此时拖拽AddressableAssets中的dll文件以及场景文件到DefaultLocalGroup栏目里,并进行改名(方便根据名称加载),改名可以在资源的Inspector里进行修改,在该面板里也会发现资源前Addressable复选框被选中了,说明是热更资源:
10、创建主程序逻辑
1、在Assets 目录下创建文件夹Main,在Main目录下 右键 Create/Assembly Definition,创建一个名为Main的程序集模块,并添加引用如下图:
2、在Main文件价夹下新建脚本LoadDll,并把此脚本挂载到MainCamera组件上,该脚本是属于Main程序集的,代码如下
using HybridCLR;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class LoadDll : MonoBehaviour
{
private Assembly hotUpdateAss;
private int aotAssemblyCount;
private List<string> aotDllList = new List<string>{
"mscorlib.dll","System.dll","System.Core.dll"};
void Start()
{
aotAssemblyCount = aotDllList.Count;
LoadMetadataForAOTAssemblies();
}
void LoadHotFix_Completed(AsyncOperationHandle<TextAsset> obj)
{
hotUpdateAss = Assembly.Load(obj.Result.bytes);
DoMainLogic();
}
void LoadAot_Completed(AsyncOperationHandle<TextAsset> obj)
{
int err = (int)RuntimeApi.LoadMetadataForAOTAssembly(obj.Result.bytes, HomologousImageMode.SuperSet);
Debug.Log($"LoadMetadataForAOTAssembly:{
obj.Result.name}. ret:{
err}");
aotAssemblyCount--;
if (aotAssemblyCount <= 0)
{
Debug.Log("load meta done");
#if !UNITY_EDITOR
Addressables.LoadAssetAsync<TextAsset>("HotFix.dll").Completed += LoadHotFix_Completed;
#else
hotUpdateAss = AppDomain.CurrentDomain.GetAssemblies().First(assembly => a