Unity5.4新版AssetBundle资源打包

(1)新版本 惟一打包API Buildpipeline.BuildAssetBundle算法

(2)在资源的Inpector界面最下方可设置该资源的assetbundleName,缓存

每一个assetbundleName对应一个Bundle,即assetbundleName相同的资源会打在一个Bundle中。服务器

(3),咱们还能够在Inpector中设置另外一个名字,即variant(变体)。在打包时,variant会做为后缀添加在assetbundleName以后。(差别区分,例如相同名字的Normal和HD的区别)异步

AssetBundleName,名字固定为小写,每一个AssetBundle均可以设置一个Variant,其实就是一个后缀,实际上AssetBundle会添加这个后缀。若是有不一样分辨率的同名资源,可使用这个来区分。函数

值得注意的是:工具

      AssetBundleName是能够带’/’符号的,这是一个很好的设计,由于咱们打包的资源会不少,若是打包生成的全部AssetBundle都生成在同一个文件目录里,这确定是很难管理的。不过名称引入’/’即可以很好解决这个问题。咱们经过名字中设置相似”npc/demon/jushiguai.unity3d”这样的名字。那么在生成AssetBundle的时候会自动根据名字生成文件目录。这样生成的AssetBundle有了分类就很好管理了。以下图: 优化

关于Assetbundle 中的脚本,在移动平台下Assetbundle里面放的脚本是不会被执行的,咱们打包前给两个Prefab挂上了脚本吗?在手机上将Assetbundle下载到本地后,加载进游戏中Prefab会自动在本地找它身上挂着的脚本,他是根据脚本的名来寻找,若是本地有这条脚本的话,Prefab会把这个脚本从新绑定在自身,而且会把打包前的参数传递进来。若是本地没有,身上挂的条脚本永远都不会被执行。ui

优化建议:加密

提供脚本批量对资源设置assetbundleName。url

规划好assetBundle所对应的资源类型,规划好assetBundle的数量。

Unity3D引擎为咱们提供了三种压缩策略来处理AssetBundle的压缩,即:

LZMA格式

LZ4格式

不压缩

LZMA格式:

在默认状况下,打包生成的AssetBundle都会被压缩。在U3D中,AssetBundle的标准压缩格式即是LZMA(LZMA是一种序列化流文件),所以在默认状况下,打出的AssetBundle包处于LZMA格式的压缩状态,在使用AssetBundle前须要先解压缩。

使用LZMA格式压缩的AssetBundle的包体积最小(高压缩比),可是相应的会增长解压缩时的时间。

LZ4格式:

Unity 5.3以后的版本增长了LZ4格式压缩,因为LZ4的压缩比通常,所以通过压缩后的AssetBundle包体的体积较大(该算法基于chunk)。可是,使用LZ4格式的好处在于解压缩的时间相对要短。

若要使用LZ4格式压缩,只须要在打包的时候开启BuildAssetBundleOptions.ChunkBasedCompression便可。

代码:

BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.ChunkBasedCompression); 

不压缩:

固然,咱们也能够不对AssetBundle进行压缩。没有通过压缩的包体积最大,可是访问速度最快。

若要使用不压缩的策略,只须要在打包的时候开启BuildAssetBundleOptions.UncompressedAssetBundle便可。

代码:

BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.UncompressedAssetBundle);

加载:

运行时加载AssetBundle对象主要能够分为两大类途径:

先获取WWW对象,再经过WWW.assetBundle获取AssetBundle对象

直接获取AssetBundle

下面咱们就具体分析一下这两种途径:

先获取WWW对象,再经过WWW.assetBundle加载AssetBundle对象:

在先获取WWW对象,在获取AssetBundle的这种方式中,咱们可使用如下两个API来实现这个功能。

public WWW(string url),直接调用WWW类的构造函数,目标AssetBundle所在的路径做为其参数,构造WWW对象的过程当中会加载Bundle文件并返回一个WWW对象,完成后会在内存中建立较大的WebStream(解压后的内容,一般为原Bundle文件的4~5倍大小,纹理资源比例可能更大),所以后续的AssetBundle.LoadAsset能够直接在内存中进行。(不管是服务器路径仍是本地路径下载操做都同样)可是bundle只能保存在内存中,也就是退出游戏在进入还得从新下载:),显然咱们实际开发中不会这样用。

 public static WWW LoadFromCacheOrDownload(string url, int version, uint crc = 0),WWW类的一个静态方法,调用该方法一样会加载Bundle文件同时返回一个WWW对象,和上一个直接调用WWW的构造函数的区别在于该方法会将解压形式的Bundle内容存入磁盘中做为缓存(若是该Bundle已在缓存中,则省去这一步),完成后只会在内存中建立较小的SerializedFile,然后续的AssetBundle.LoadAsset须要经过IO从磁盘中的缓存获取。

直接加载AssetBundle对象:

在4.x时代,咱们能够经过CreateFromFile或CreateFromMemory方法将磁盘上的文件或内存中的流构形成咱们须要的AssetBundle对象。可是在5.x版本中,曾经的这两个方法已经被新的LoadFromFile、LoadFromMemory方法所代替(这两个方法还有异步的版本),且机制上也有了一些区别。

public static AssetBundle LoadFromFile(string path, uint crc = 0):新的从文件建立加载AssetBundle方法和4.x中的CreateFromFile方法在机制上有了一些分别,旧的CreateFromFile必须使用未压缩的Bundle文件才能在运行时动态建立AssetBundle对象。而新的LoadFromFile方法则没有这个要求,它支持上一节中提到的几个压缩格式,针对LZ压缩格式和未压缩的磁盘上的bundle文件,该方法会直接加载。针对使用默认的LZMA压缩格式压缩的bundle文件,该方法会在幕后先将bundle文件解压后再加载。这是最快的加载AssetBundle的方式。该方法是同步版本,还有异步版本:LoadFromFileAsync。

public static AssetBundle LoadFromMemory(byte[] binary, uint crc = 0):从内存中获取Bundle的二进制数据,同步地建立AssetBundle对象。该方法通常用在通过加密的数据上,通过加密的流数据通过解密以后咱们能够调用该方法动态的建立AssetBundle对象。该方法是同步版本,还有异步版本:LoadFromMemoryAsync。

实际使用环境的分析:

(1) 随游戏一同发布的AssetBundle(通常位于StreamingAssets文件夹中):

在打AssetBundle包时,使用LZ4压缩格式进行打包(开启BuildAssetBundleOptions.ChunkBasedCompression便可)。

在运行时须要加载AssetBundle对象时,使用LoadFromFile方法进行加载。

这样作的好处是:便可以将AssetBundle文件压缩,又能够兼顾加载速度,且节约内存。

(2) 做为更新包,须要从服务端下载的AssetBundle:

在打AssetBundle包时,使用默认的LZMA格式压缩。

使用WWW.LoadFromCacheOrDownload方法下载并缓存AssetBundle包文件。

这样作的好处是:得到了最大的压缩率,在下载过程当中能够减小数据传输量。同时,在本地磁盘建立缓存以后,又能够兼顾以后的加载速度,且节约内存。

(3) 进行加密的AssetBundle:

在打AssetBundle包时,使用LZ4压缩格式进行打包(开启BuildAssetBundleOptions.ChunkBasedCompression便可)。

在运行时须要加载AssetBundle对象时,使用LoadFromMemory方法进行加载。(这也是从内存中使用流数据加载AssetBundle对象的仅有的使用场景。) 

(4)须要本身压缩的AssetBundle:

咱们本身也可使用第三方库或工具对生成的AssetBundle包文件进行压缩,若是须要这样作,则咱们最好不要再使用Unity3D对AssetBundle进行压缩,所以在打包时选择开启BuildAssetBundleOptions.UncompressedAssetBundle。

在运行时须要加载AssetBundle对象时,使用LoadFromFileAsync方法进行异步加载。

资源加载:

新版的AssetBundle中,加载资源的API已经变成了如下的几个:

LoadAsset:从资源包中加载指定的资源

LoadAllAsset:加载当前资源包中全部的资源

LoadAssetAsync:从资源包中异步加载资源

卸载资源:

资源卸载部分的变化不大,使用的仍然是Unload方法。

Unload()

该方法会卸载运行时内存中包含在bundle中的全部资源。

当传入的参数为true,则不只仅内存中的AssetBundle对象包含的资源会被销毁。根据这些资源实例化而来的游戏内的对象也会销毁。

当传入的参数为false,则仅仅销毁内存中的AssetBundle对象包含的资源。

其余:

新增打包模式

ForceRebuildAssetBundle             : 强制从新打包全部AssetBundle文件,通常状况只作增量打包。

IgnoreTypeTreeChanges              : 用于判断AssetBundle更新时,是否忽略TypeTree的变化。

AppendHashToAssetBundleName : 将Hash值添加在AB包文件名以后,开启后可经过文件名来判断哪些AB进行了更新。

依赖项相关:

虽然Unity说会帮咱们处理好依赖关系,可是只是说可以方便获取一个asset的依赖项,并不会帮你自动加载全部依赖项。因此咱们加载的代码仍是三个部分:加载依赖项和加载自身,卸载依赖项。

Dependencies(资源依赖关系):当某个资源依赖其它AB 包中的文件时候,manifes(清单)文件中显示依赖关系。

相关文章
相关标签/搜索