• (Unity4.7)assetbundle 坑爹总结


    使用版本Unity4.7

    一、关于依赖打包

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

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

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

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

    三、关于Unload

    四、关于B(依赖A)重新打包,A是否要重新打包。即依赖资源更新,被依赖的资源是否需要重新打包的问题

    五、关于GraphicsSettings和shader的打包

    1、如果单独打包一个资源c,c引用了一个NGUI自定义shader Unlit/Transparent Colored,选择了BuildAssetBundleOptions.CollectDependencies,那么这个shader会打包到这个资源包中

    2、如果不选择BuildAssetBundleOptions.CollectDependencies,那么shader则不会打包。那么这个资源包在加载到本地的时候是否会自动关联到本地的shader呢?这个要分为两种情况讨论。

    第一种,就是如图 5.1,将shader Unlit/Transparent Colored加入到GraphicsSettings中,这样设置之后再打包,即使没有选择BuildAssetBundleOptions.CollectDependencies,当资源包加载到本地的时候也可以自动关联这个shader。(需要保证shader会被打包到安装包,要放在 Resource文件夹下

     

                       图 5.1

    第二种,就是如图 5.2,没有在GraphicsSettings中设置这个shader,然后打包,那么资源包加载到本地的时候是不能自动关联这个shader的,结果如图 5.3。

                                                        

                     图 5.2

                    图 5.3

    3、如果选择BuildAssetBundleOptions.CollectDependencies,包shader打包成基础包,c去依赖这个shader基础包又分为两种情况

    3.1 c用到的shader都在shader基础包中,那么一切正常。

    3.2 c用到的shader一部分在shader包中,那么这一部分正常,不在基础中的shader c并不会打包到自己身上,而回在在被加载回来后在本地寻找GraphicsSettings列表,找不到测丢失shader。(但是内置shader是可以自动关联)

     

    六、关于循环打包

    在做打包工具的时候我们要对多个预设已经依赖打包。

    比如打包BCDEF,他们都依赖A

    你以为可以这样写:

    push

    build A

    push

    for BCDEF列表 

    build 

    pop

    pop

    然后你发现脚本各种丢失。。。

    实际上应该这样:

    push

    build A

    push

    for BCDEF列表 

    push

    build 

    pop

    pop

    pop

    这层push pop一定要写,表示BCDEF是不互相依赖的并列关系~

    七、关于AssetBundle.CreateFromFile

    文档如下:

    AssetBundle.CreateFromFile

     
    public static AssetBundle CreateFromFile(string path);

    Parameters

    path Path of the file on disk

     

    See Also: WWW.assetBundleWWW.LoadFromCacheOrDownload.

    Description

    Loads an asset bundle from a disk.

    Only uncompressed(只支持不压缩的,打包的使用需要选择uncompressed,默认是压缩的) asset bundles are supported by this function. This is the fastest way to load an asset bundle

    还有一个非常肯定的地方,用这儿方法加载的assetbundle不能有重名的,即使路径不一样,不然会报错,提示已经加载过相同的包!

  • 相关阅读:
    提示“此Flash Player与您的地区不相容,请重新安装Flash”的解决办法
    python中安装并使用redis
    linux安装flash player来播放视频
    安装redis
    centos6.5安装无线网卡驱动并配置wifi
    centos安装java的jdk
    001-python简介
    源码
    进程间通信之综述
    图的概念
  • 原文地址:https://www.cnblogs.com/wonderKK/p/4266680.html
Copyright © 2020-2023  润新知