首页 > 代码库 > assetbundle 坑爹总结

assetbundle 坑爹总结

一、关于依赖打包

1、当一个被打包的资源A引用了其他的资源B,并且没有被打成一个包时,要选用【BuildAssetBundleOptions.CollectDependencies 收集依赖关系】或者【BuildAssetBundleOptions.CompleteAssets 完整资源】(两者并不冲突可以全选)来进行打包,否则打包的时候unity也会发出警告:A上的组件丢失。

当选择了BuildAssetBundleOptions.CollectDependencies时,果然你没有将A依赖的资源B使用BuildPipeline.PushAssetDependencies() 和BuildPipeline.PopAssetDependencies()来进行依赖打包,那么A会把其引用的资源都打包到自己的assetbundle 中。如果引用的资源是图片、sprite或自定义的shader(内置的shader不会打包,这里的自定义shader可以被看作是一种资源),那么会打包到assetbundle 中。如果引用的是代码,那么会打包一个对工程中代码的引用,也就是说引用的代码必须存在于工程中,这样当c被加载到本地的时候才可以和本地的代码进行关联,如果本地没有这个代码,则会丢失对这个脚本的引用。如图所示可以看到打包的资源(图片和NGUI中自带的shader)和脚本代码的引用:

技术分享技术分享

 

当只选择BuildAssetBundleOptions.CompleteAssets进行打包的时候,则不会将A引用的资源打包进来,通过调试也可以查看到包比使用CollectDependencies的小很多,断点后也发现不包括依赖的资源。我的理解是等于我们告诉了unity我已经把所有资源放进资源包了,所以它也不会报错。据官方文档说在打包模型和动画的时候这个选择会起作用,还需要进一步的实践验证。如果只是用CompleteAssets而不使用CollectDependencies打包,那么由于资源包中不带引用的信息,即使是引用的脚本(或资源)在本地工程存在,也会在assetbundle 被加载下来后丢失掉对脚本(或资源)的引用。

二、关于依赖资源链式查找的机制猜想

三、关于Unload

 

assetbundle 坑爹总结