AssetBundle整合资料深入理解

实质是一个封装好的压缩解压类型,通过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值,还没有验证,目前没这需求,)













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值