zoukankan      html  css  js  c++  java
  • Unity的资源加载以及AssetBundle的一些坑

    • 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()时手动析构它们。否则会造成内存泄露。
  • 相关阅读:
    asp.net C# 实现阿里大鱼和云片网短信接口类
    asp.net C# 实现微信接口权限开发类
    asp.net C# 实现微信服务器配置
    php学习资料
    阿里云ECS升级OpenSSL记录
    Docker(十三):OpenStack部署Docker集群
    Docker(十二):Docker集群管理之Compose
    Docker(十一):Docker实战部署HTTPS的Tomcat站点
    Docker(十):Docker安全
    Docker(九):Docker容器卷插件
  • 原文地址:https://www.cnblogs.com/sigmadruid/p/4040803.html
Copyright © 2011-2022 走看看