Unity之热更新:(一)AssetBundle
1. AB包是什么? 资源压缩文件,包含了serialized file(序列化文件)和resource file(源文件:二进制资源(图片、声音)被单独保存)
2. AB包有什么作用?减少包体大小,比Resources灵活;
3. AB包资源打包:
1)Unity编辑器,自定义打包工具
2)官方提供打包工具:Asset Bundle Browser
4. AB打包流程:
1)指定资源的AssetBundle属性
2)构建AssetBundle包
3)上传AB包
4)加载AB包
5. 打包分组策略:
1)逻辑实体分组:一个UI界面一个包、一个角色一个包、场景共享部分一个包
2)类型分组:声音资源一个包、shader一个包、模型一个包、材质一个包
3)使用分组:一个关卡一个包、一个场景一个包
依赖打包:共享资源单独打一个包(否则每个使用该资源的物体都会打包一个该资源,会占用更多空间。
比如两个物体都用了同一个材质,如果把两个物体打包,则会生成 (物体A+材质)+(物体B+材质),若把共享材质打一个包,
再把两物体打包,则会生成 共享材质+物体A+物体B)
6. 实例演示
1)指定资源的AssetBundle属性
2)构建AssetBundle包
1 //把打包方法设置为菜单组件 2 [MenuItem("Assets/Build AssetBundles")] //MenuItem属性允许把自定义静态函数当做菜单命令添加到主菜单和检视面板 3 static void Build_AssetBundles() 4 { 5 BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); 6 }
//第一个参数:打包路径;第二个参数:打包设置;第三个参数:打包目标平台
第二个参数 BuildAssetBundleOptions
- None:LZMA算法压缩,压缩包的最小,但加载时间长(解压)。
- UncompressedAssetBundle:不压缩,包大,加载快
- ChunkBasedCompression:LZ4压缩,压缩率<LZMA,但是可以加载指定资源而不用解压全部(加载速度接近不压缩,且包更小)
StreamingAssets文件夹详解参考https://blog.csdn.net/iningwei/article/details/89097130
注意设置菜单组件脚本要放在Editor文件夹下才有效
打包之前要先把打包文件夹建好
可以让资源按文件夹分类打包
打包出来的mainfest文件是什么?我们可以用记事本打开该文件
Assets:声明了包含的Object及路径,Dependencies:声明了依赖的文件
4)加载本地AB包 在开发阶段将AB包放在本地,开发结束后再上传到服务器
三种加载方式:
1. 从内存加载:AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
-------------------------------------------------------------------------------------------------------
2. 从本地加载:AssetBundle.LoadFromFile(path);
-----------------------------------------------------------------------------------------------------
3. WWW加载:www www = www.LoadFromCacheOrDownload(path,1);
yield return www;
AssetBundle ad = www.assetBundle;
此方法会缓存,所以assetbundle尽量小; 一次仅下载1个asset bundle。
现在被UnityWebRequest替代了,因为UnityWebRequest支持断点续传、timeout、在一些复杂操作上也有更好的表现。
UnityWebRequest request = UnityWebRequest.GetAssetBundle(url);
yield return request.Send();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
--------------------------------------------------------------------------------------------------------
a.加载单个资源
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath+"/prefabs/001.unity3d"); GameObject myPrefab = ab.LoadAsset<GameObject>("Cube"); //注意这里传入的名称是打包前单个物体的名称 Instantiate(myPrefab);
b.加载多个资源
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath+"/prefabs/001.unity3d"); Object[] myPrefabs = ab.LoadAllAssets(); //取出001包里 Sphere Cube Ground三个物体 foreach (var v in myPrefabs) { Instantiate(v); //把资源实例化 }
5 ) 为了减少内存占用,也要卸载不用的资源
场景切换,之前场景的AB包资源不需要使用了:AssetBundle.Unload(true)
仅卸载没有被使用的资源:AssetBundle.Unload(false)
卸载单个资源:Resources.UnloadUnusedAssets
其他加载方式与上传方式,见siki学院视频https://www.bilibili.com/video/BV1Yb4y1U7nt?p=17