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

posted @ 2021-12-05 17:25  番茄玛丽  阅读(379)  评论(0编辑  收藏  举报