zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【算法】哈希表法四部曲
    【算法】位运算技巧
    【算法】分治法四步走
    【算法】分支界限三步走
    【Java】位操作符
    【Java】String字符串格式化
    阿里一面,给了几条SQL,问需要执行几次树搜索操作?
    c++随机数问题研究
    Google单元测试框架gtest之官方sample笔记4--事件监控之内存泄漏测试
    Google单元测试框架gtest之官方sample笔记3--值参数化测试
  • 原文地址:https://www.cnblogs.com/tomatokely/p/15643085.html
Copyright © 2011-2022 走看看