Unity AssetBundle以及HybridCLR热更新框架试用
一、AssetBundle
- 简介
每个资源的Inspector视窗底部都有AssetBundle选项,前一部分是AB名称,后一部分是AB后缀名称
在打包过程中Unity会将相同AB标签的资源打包到一起
- 特点
- 平台差异:特定于平台的资产压缩包,所以打包是需要选择对应的平台
- 相互依赖:AB之间可以互相依赖引用
- 热更友好:一般将一些资源放在服务器,一来方便热更,二来应用安装包不会太大
- 打包
没有什么特殊需求直接用Unity官方提供的打包工具就好,通过URL添加Package
1
| 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 40
| public 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 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请求资源,当然本地资源也可以用这种方法加载,不过需要注意路径
不过一般都是检查版本后先将资源更新到本地,然后再进行加载