AssetBundle打包&HybridCLR热更新
Unity AssetBundle以及HybridCLR热更新框架试用
一、AssetBundle
- 简介
每个资源的Inspector视窗底部都有AssetBundle选项,前一部分是AB名称,后一部分是AB后缀名称
在打包过程中Unity会将相同AB标签的资源打包到一起
- 特点
- 平台差异:特定于平台的资产压缩包,所以打包是需要选择对应的平台
- 相互依赖:AB之间可以互相依赖引用
- 热更友好:一般将一些资源放在服务器,一来方便热更,二来应用安装包不会太大
- 打包
没有什么特殊需求直接用Unity官方提供的打包工具就好,通过URL添加Package1
https://github.com/Unity-Technologies/AssetBundles-Browser.git
安装好后在菜单栏 Window -> AssetBundle Browser 打开面板
可以查看当前创建的标签下的资源,选择打包目标平台,输出路径,然后打包即可
二、HybridCLR
我们以官方提供的体验项目为基础搭建工程 点我前往Github下载
- 配置
打开项目后菜单栏选择 HybridCLR -> Install.. 安装代码到本地目录
PlayerSetting中选择 IL2CPP 和 .NET Framework
- LoadDll.cs
主场景找到该脚本,做一些修改1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40public class LoadDll : MonoBehaviour
{
void Start()
{
BetterStreamingAssets.Initialize();
StartCoroutine(StartGame());
}
IEnumerator StartGame()
{
LoadMetadataForAOTAssemblies();
#if !UNITY_EDITOR
System.Reflection.Assembly.Load(BetterStreamingAssets.ReadAllBytes("Assembly-CSharp.dll.bytes"));
#endif
//var uwr = UnityWebRequest.Get("https://xxxxxx.com/unity");
//var uwr = UnityWebRequest.Get(Application.dataPath + "/ABs/prefabs");
yield return uwr.SendWebRequest();
AssetBundle prefabAb = AssetBundle.LoadFromMemory(uwr.downloadHandler.data);
GameObject testPrefab = Instantiate(prefabAb.LoadAsset<GameObject>("Cube.prefab"));
GameObject cube = Instantiate(prefabAb.LoadAsset<GameObject>("Capsule.prefab"));
}
private static void LoadMetadataForAOTAssemblies()
{
List<string> aotMetaAssemblyFiles = new List<string>()
{
"mscorlib.dll",
"System.dll",
"System.Core.dll",
};
HomologousImageMode mode = HomologousImageMode.SuperSet;
foreach (var aotDllName in aotMetaAssemblyFiles)
{
byte[] dllBytes = BetterStreamingAssets.ReadAllBytes(aotDllName + ".bytes");
LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode);
Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}");
}
}
}
如果有服务器,可以把打好的AB包放在服务器,然后通过UnityWebRequest请求资源,当然本地资源也可以用这种方法加载,不过需要注意路径
不过一般都是检查版本后先将资源更新到本地,然后再进行加载