Unity游戏开发入门征服Unity3dunity3D技术分享

Unity之AssetBundle

2017-08-21  本文已影响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打开

上一篇 下一篇

猜你喜欢

热点阅读