Unity之AssetBundle

作者: 程序小妖精 | 来源:发表于2017-08-21 18:03 被阅读178次

                              了解AssetBundle

    一:首先我先来了解一下AssetBundle用处:

      1.AssetBundle是一个资源包(可以是压缩包),包括模型、贴图、预设体、声音、甚至是整个场景,可以在游戏运行的时候被加载。

      2.AssetBundle自身保存着互相依赖的关系。

      3.压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快进行网络传输。

      4.把一些可以下载的资源放在AssetBundle里,可以减少安装包大小。

    二:什么是AssetBundle我们可以总结为一下两点:

      1.它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。而这些文件可以分为两类:serialized file和resource files.(序列化文件和源文件)。

       serialized file(序列化文件):资源(比如模型,预设体等)被打碎放在一个对象中,最后统一被写进一个单独的文件  (只有一个)。

      resource files:某些二进制文件(声音,图片)被单独保存,方便快捷加载。

    2.它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。

                            AssetBundle使用流程

    1、指定资源AssetBundle属性,(xxxa/xxx)这里xxxa会生成目录,名字为xxx.

    2、构建AssetBundle包。

    3、上传AB包到服务器。

    4、加载AB包和包里的资源。

     我们在场景中创建一个Cube,重命名为Wall

    然后把wall拉成预设体,并指定AssetBundle属性

    我们创建一个工具文件夹Editor(此文件里代码只有在unity编辑器里才会编译,不会被发布)

    CreateAssetBundles中脚本打包脚本

    在Assets 下Build AssetBundles执行,在跟目录生成了AssetBundles文件夹

    文件内容:

    AssetBundles 二进制文件,和包名一致,AssetBundles.mainfest记录了所有的AssetBundle包

    wall.unity3d则是我们打的AB包,wall.unity3d.manifest则记录了AB包中的引用资源

                                  加载本地的AB包与包里的资源

    创建脚本LoadFromFileExample挂载在空物体LoadAB上

    脚本LoadFromFileExample加载方法LoadAsset如下

    运行效果如下

                         注:AssetBundle分组策略

                                   一个AssetBundle就是一组,不是分文件夹

    1、逻辑实体分组

        a、一个UI界面或者所有UI界面一个包(这个界面里面的贴图和布局信息一个包)

        b、一个角色或者所有的角色一包(这个角色里面的模型和动画一个包)

        c、所有的场景所共享的部分一个包(包括贴图和模型)

     2、按照类型分组

         所有声音资源打成一个包,所有shader打成一个包,所有模型打成一个包,所有材质打 成一个包。

    3、按照使用分组

        把在某一时间内使用的所有资源打成一个包。可以按照关卡分,一个关卡所需要的资源包括角色、贴图、声音等打成一个包。也可以按照场景分,一个场景所需要的资源一个包。

                                     AssetBundle分组策略-总结

    1、把经常更新的资源放在一个单独的包里面,跟不经常更新的包分离。

    2、把需要同时加载的资源放在一个包里面。

    3、可以把其他包共享的资源放在一个单独的包里面。

    4、把一些需要同时加载的小资源打成一包。

    5、如果对于个同一个资源有两个版本,可以考虑通过后缀来区分 如:unity3dv1, unity3dv2

                                                        依赖打包

    减少公共资源占有量:Unity自动处理,我们只需要把AssetBundle属性设置好,打包关系如下

                           参数解释:Build AssetBundle-

    1、Build的路径(随意只要是在硬盘上都可以的)

    2、BuildAssetBundleOptions

        BuildAssetBundleOptions.None:使用LZMA压缩算法,压缩的包更小,但是加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。在下载的时候,可以使用LZMA算法,一旦被它下载了之后,他会使用LZ4算法保存到本地上。

      BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快。

      BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源二不用解压全部。

    注:使用LZ4压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小。

    解:案例证明如:一个material的大小为134KB,LZMA压缩为62KB,LZ4压缩为84KB.

                                         Manifest讲解:

      我们先以share来讲解,打开share.manifest

      CRC:文件验码,校验文件是否完整的。与之对应为MD5

      Assets:指定了我们报里有哪些资源。

                  我们来讲解一下依赖:capsulewall.manifest来讲解

       Dependencies:依赖。

    注:

           我们加载资源时,如prefable时,如果有依赖,我们要加载依赖,否则会出现丢失。加载的先后顺序没有关系。(官方API,说先加载依赖,但经过证实,与先后顺序无关。为了有一个好习惯,先加载依赖,比较符合逻辑些,好习惯)

                     简单的服务器搭建webserver

         注:把资源放在NetBox2.exe同目录,运行NetBox.ext启动服务器

                              AssetBundles的使用

    1、AssetBundle.LoadFromMemoryAsync(从内里里加载)


    2、AssetBundle.LoadFromFile(从本地文件)

    3、WWW.LoadFromCacheOrDownload(从服务器或本地,有一个缓存,2017以后将要 弃用)


    4、UnityWebRequest(从服务器加载)

     


                                  通过Manifest文件得到某个包的依赖

    Manifest指的是(和文件夹同名的manifest),如

                                     AssetBundle的卸载

    卸载的两个方面:

    1、减少内存使用

    2、卸载不当有可能导致关联丢失

    卸载的原则:

      AssetBundle.Unload(true) 卸载所有资源,即使有资源在使用者。

        1、在关卡切换、场景切换。

       2、资源没有被调用的时候 卸载

     AssetBundle.Unload(false)卸载所有没有被使用的资源

      1、个别资源怎么卸载,通过Resources.UnloadUnusedAssets.

     2、场景切换的时候

                                         文件校验

                               AssetBundle浏览工具

    Unity Asset Bundle Browser tool(开源的一个插件)

     获得步骤:

    Help=>Unity manual=>搜AssetBundle 在最后一个就可以看到了哦


    GitHub的一个链接,然后我们进去下载

    拉进工程,然后在Window=>AssetBundle Browser打开

    相关文章

      网友评论

        本文标题:Unity之AssetBundle

        本文链接:https://www.haomeiwen.com/subject/xeffdxtx.html