实质是一个封装好的压缩解压类型,通过BuildAsset系列函数压缩,通过www.assetbundle解压。
--打包的难点在于资源依赖。
而之所以要用资源依赖,实际上是不想将公用的资源打包进多个Bundle中,资源重复,一是下载量大,改动一点就要打包一大块的Bundle,二是占用空间大,本地资源里有很多重复的空间占用,加载到内存中也一样。
关于资源依赖,会遇到好多种情况,分实际项目需求而定。
①本身项目就不大,资源包Bundle也没有特别大的资源,可以不考虑资源重复的问题,这时候不采用手动资源依赖的方式打包,而是直接打包主体资源(如模型),这时候unity会自动将主体资源相关联的所有资源(贴图、材质、网格等)拷贝进指定的Bundle中,即unity本身的打包依赖就是每个Bundle都会将所用到的资源封装进来。5.x以后,如果关联资源指定了AssetBundleName的话,则会自动按照依赖方式生成依赖包,关联资源一个包Bundle0,主体一个包Bundle1,主体Bundle1中依赖Bundle0,引用主体资源前必须先加载依赖资源。【如果你公用的(关联资源)是一个FBX模型,你只给这个模型设置BundleName还不行,它用到的贴图,材质都要设,否则模型是公用了,贴图没有公用,结果贴图还是被打包到多个包中了。】
项目小的话,就不做依赖资源包,这种方式好处是不需要为每个资源指定AssetBundleName,也不需要强制先加载依赖包再引用主体。
②将所有相关联的资源都整合进一个Bundle,比如10不同的prefab都引用了某几张图片Texture,那么将这10个prefab和这几个Texture打包进一个Bundle里,这样就避免了Texture打包金多个Bundle中。但这也存在另一个问题,就是增量更新的粒度化,如果我只想更新10个prefab中的一个,就必须重新打包这个大的包含10个prefab的Bundle,那就要看这10个prefab打包的Bundle大不大,如果不大,可以采用这种方式。
③资源依赖的方式了。
Unity5的AssetBundle的一点使用心得
5.x打包使用
BuildPipeline.BuildAssetBundles(outputPath)的方法,然后每一个资源可以设置一个assetBundleName。只要你调用这个方法,那么所有已经设置过assetBundleName的资源,就会自动打包,具体的好处有:
1、可以直接在编辑器UI上设置操作
2、提供了更简便的脚本API
3、Unity本身会处理所有的依赖关系
4、生成了一种叫做manifest的文件,用于记录资源之间的依赖关系,并以链式结构记录,修改时只需修改链的其中一环
5、增量打包功能。
在打包的时候,会有一个总的manifest文件和与之对应的Bundle,里面只有一个manifest文件,记录了所有Bundle的依赖关系,具体的名字与输出目录的文件夹名字有关。除了这个总的Bundle和manifest文件外,每一个小的资源也会有一个Bundle和manifest。我们在加载的时候,需要先把总得Bundle加载进来,根据其内的manifest文件需要对应的Bundle的依赖。
资源依赖的好处是最小更新,带来的就是速度快。
但是如果粒度过小,而资源依赖引用的关系复杂,使用起来就需要遍历所有依赖,先加载依赖,稍微麻烦一些。
非常详细全面的介绍AssetBundle
创建Assetbundle】
老的方式:
使用方法 BuildPipeline.BuildAssetBundle (Object, assets , pathName , options , targetPlatform)
参数1:它只能放一个对象。
参数2:可以放入一个数组对象。
参数3:保存路径。
参数4:BuilderAssetBundleOptions
CollectDependencies // 包含所有依赖关系。
CompleteAssets//强制包含整个资源
DisableWriteTypeTree//在资源包不包含类型信息。
DeterministicAssetBundle//编译资源包使用一个哈希表储存对象ID在资源包中。
UncompressedAssetBundle//不压缩Assetbundle,默认会进行压缩
参数5:平台
特别注意的是,电脑上和手机上打出来的Assetbundle不能混用,不同平台只能用自己的。
载入Assetbundle】
使用方法:
1)WWW bundle = new WWW(path);
2)WWW bundle = WWW.LoadFromCacheOrDownload(path, fileVer);
载入成功后就可以通过资源名使用bundle.assetBundle.Load方法获取资源
使用方法 BuildPipeline.BuildAssetBundle (Object, assets , pathName , options , targetPlatform)
参数1:它只能放一个对象。
参数2:可以放入一个数组对象。
参数3:保存路径。
参数4:BuilderAssetBundleOptions
CollectDependencies // 包含所有依赖关系。
CompleteAssets//强制包含整个资源
DisableWriteTypeTree//在资源包不包含类型信息。
DeterministicAssetBundle//编译资源包使用一个哈希表储存对象ID在资源包中。
UncompressedAssetBundle//不压缩Assetbundle,默认会进行压缩
参数5:平台
特别注意的是,电脑上和手机上打出来的Assetbundle不能混用,不同平台只能用自己的。
载入Assetbundle】
使用方法:
1)WWW bundle = new WWW(path);
2)WWW bundle = WWW.LoadFromCacheOrDownload(path, fileVer);
载入成功后就可以通过资源名使用bundle.assetBundle.LoadAsset方法获取资源。
AssetBundle.CreateFromFile这个在老版本智能加载非压缩的文件,新版本5.x可以直接加载Bundle文件。
LoadFromCacheOrDownload(string url, Hash128 hash);
这个主要是针对同一种AssetBundle的两种不同资源:常用在Variant的使用上,如不同分辨率的两套Bundle资源都是同一个名字(或者多语言图片资源),用Hash来区分。
AssetBundleName为model,Variant设置为low、midle、high低中高三套分辨率,此时会生成三套的Bundle,但是都是同一个名字,里面的hash值不同,这样通过hash来去同名不同套的Bundle了。
(后面发现生成的Bundle是带有Variant值得,但是貌似loadCache的时候不需要添加这个Variant值,还没有验证,目前没这需求,)