Unity的资源加载以及AssetBundle的一些坑

Posted alps

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity的资源加载以及AssetBundle的一些坑相关的知识,希望对你有一定的参考价值。

https://www.cnblogs.com/sigmadruid/p/4040803.html

 

 

  • AssetBundle加载完毕,进行其中Asset的初始化后,不能立即Unload()。否则Asset的初始化会有问题,依赖关系会Missing。需要等待个1,2秒再Unload()。因为Instantiate()也有一个delay,尽管它可以立即返回一个GameObject对象。
  • Static Batch只对预先在场景中摆好的静态对象起作用。运行时加载的对象则可能会失效。这时可以调用StaticBatchingUtility.Combine(GameObject root);手动触发Static Batch。
  • 光照贴图的uv信息保存在Mesh的uv2属性上,是一个Vector2[]。模型的导入选项中,如果勾选Generate Lightmap UV会自动生成这些uv信息。但是在将模型打包到AssetBundle时这些uv会丢失。可以使用配置文件手动记录。在加载这些模型时,再通过代码将它们恢复。
  • 模型的name(gameObject.name)和它的Mesh的name(gameObject.renderer.mesh.name)是不一样的。
  • AssetBundle打包出来的粒子可能会丢失Shader。只要在打包的项目中,把可能用到的Shader加入到Edit->Project Settings->Graphics->Always Included Shaders这个列表里就行了。
  •  AssetBundle里的资源会随着AssetBundle的卸载而从内存消失。
    这是个恶心的问题。考虑一种情况,你有3个AssetBundle:A保存Prefab,B保存Mesh,C保存Texture和Material。依赖关系是A->B->C。于是你依次载入C,B,A,再把A里的Prefab给Instantiate一个,就会得到完整的GameObject。这时,你想这仨AssetBundle不要了卸了吧。卸载完,你发现Mesh,Texture,Material都没了。因为B,C里的资源是都被依赖的,但是卸载时缺没有被考虑到。但是你要是将B,C的东西也Instantiate各一份出来,依赖关系就没了,只能自己添加。
    因此,建议相关的资源最好打成一个AssetBundle。这样依赖关系是稳定的。或者你自己维护一个依赖关系。这事儿你要指着Unity,还真不太靠谱。
  • 不要将循环迭代的变量传入到循环中的闭包函数中。因为迭代变量会被循环改写。可以在循环内创建一个局部变量来存储该变量。因为闭包使用外部参数的机制本质还是记录内存地址。这种错误在你循环初始化一些资源,并且在回调时才能得到的情况下,很容易遇到。
  •  在编辑器模式中,对Resources目录中内容修改后,需要AssetDataBase.Refresh()后才能使用Resources.Load()读取到其中的内容。
  • 通过AssetBundle读取的资源,例如通过Load(),LoadAll()和mainAsset,是不能进行Destroy的。当AssetBundle被卸载时,会被一起析构。最好先Instantiate()出来一份再使用。Texture2D、Mesh这样的资源,需要在导入选项里勾选Read/Write Enabled。

  • 一些GameObject如果被MonoBehavior的变量(数组,List,Dictionary等)持有,则必须在OnDestroy()时手动析构它们。否则会造成内存泄露。
  • Prefab之间不会建立依赖,即如果Prefab-A和Prefab-B引用了同一张纹理,而他们设置了不同的abName,而共享的纹理并未设置abName,那么Prefab-A和Prefab-B可视为分别打包,各自Bundle中都包含共享的纹理。因此在使用UGUI,开启Sprite Packer时,由于Atlas无法标记abName,在设置UI界面Prefab的abName时就需要注意这个问题。

    5.x中加入了Shader stripping功能,在打包时,默认情况下会根据当前场景的Lightmap及Fog设置对资源中的Shader进行代码剥离。这意味着,如果在一个空场景下进行打包,则Bundle中的Shader会失去对Lightmap和Fog的支持,从而出现运行时Lightmap和Fog丢失的情况.而通过将Edit->Project Settings->Graphics下shader Stripping中的modes改为Manual,并勾选相应的mode即可避免这一问题。


以上是关于Unity的资源加载以及AssetBundle的一些坑的主要内容,如果未能解决你的问题,请参考以下文章

AssetBundle Browser 教程丨Unity自带的一款AB包打包工具

AssetBundle Browser 教程丨Unity自带的一款AB包打包工具

AssetBundle Browser 教程丨Unity自带的一款AB包打包工具

unityab相同名字加载更新

Unity3D资源异步加载——AssetBundle资源打包加载

unity5本地文件assetbundle怎么加载