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()时手动析构它们。否则会造成内存泄露。
时间: 2024-10-14 00:13:15

Unity的资源加载以及AssetBundle的一些坑的相关文章

Unity3d热更新全书-资源加载(一)从AssetBundle说起

Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle. 我们也来说说AssetBundle 我们试全面的分析一下Unity3D提供的资源加载机制 1.Resources//内嵌资源,使用方法Resources.Load,可以加载任意种类的资源,不能动态修改,卒. 2.StreamingAssets//随包资源,使用方法IO或WWW.Load.WWW.Load可以加载任意种类资源,IO仅限bytes 和 text. 3.W

Unity3D之AssetBundle资源加载封装

1.当资源更改变化时,如何能快速得反应到开发中. 解决方案: 我使用宏定义UNITY_EDITOR来判断是否是开发编辑状态.当处于开发编辑状态时,自动读取指定目录下U3D本身资源,而不使用AssetBundle.这样就达到了当prefb变化时能快速反应到开发编辑中.而当不是处于编辑状态时,则正常使用异步加载读取AssetBundle.这个方式唯一的毛病就是,必须让所有U3D程序员都非常清除明白,如果写错,编辑模式下会没问题,发布后会出问题,所以需要检查. 2.当不同资源之间有重复的资源时如何将A

升级MAC OS到10.13, 10.14系统后UNITY工程无法加载资源的解决办法

升级MAC OS到10.13, 10.14系统后,出现UNITY工程无法加载资源的情况: Unity项目中Asset目录显示为空! 解决办法一: 打开Launchpad中的磁盘工具 (也就是实用工具下的"磁盘工具") 新建一分区,名称大小任意,格式为MAC OS 扩展(日志式) 将unity工程移至新分区 OK,工程已经可以正常加载了 解决办法二: 1. 升级Unity版本 (如Unity5.6.6, Unity 2018.1 均可以)   2. 安装相应的补丁版Unity3D 参考链

【原创】我所理解的资源加载方式

最近转战unity3d,接的第一个任务就是关于资源管理的部分. 由于项目是web和standalone(微端)并存的,所以希望保证业务逻辑尽量保持一致,跟之前ios,android的执行流程略有不同,比如在web模式下,FILE类是被禁用的,所以指望通过写文件来操作相关功能参数的方法是不可行的.下面,是我对这方面的一些理解.本文中如果没有特殊说明,下载的资源都是AssetBundle web程序的运行流程大致是 首先加载web.html,这是整个程序的入口 他会加载相关的unity3d文件(本例

Unity 全面理解加载和内存管理

最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的. 其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成了. 详细说一下细节概念:AssetBundle运行时加载:来自

Unity 显示Loading(加载)进度 对于网上流行的方法进行更正

实际上就是MOMO贴出来的方法其实是有问题的,用过的才知道.至于别的几乎不用找,根本一个抄一个,抄来抄去都是一样,没自己的东西. 用过MOMO那个方法的都应该会发现了,当进度条开始显示的时候,基本上已经加载到80%了,可能也跟Unity版本有关,我的是4.3.4 .但是实际上Unity的工作原理差不多就那样,在Start里面直接开始加载的协程,实际上一开始就会阻塞,导致画面刚刚渲染出来的时候,已经完成了一部分的加载,而很多资源会在一开始就加载了,如果这里的资源太多了,那么就会像我一样,显示很长时

Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关

资源加载是必备的知识点,这里就说说Mecanim动画的资源如何打包及加载. 注意,Unity4.x和Unity5.x的AssetBundle打包策略不一样,本笔记是基于Unity4.x的AssetBundle进行打包的. 我们一般使用FBX类型的模型及动画文件,而动画文件的储存一般有两种情况,一是所有的动画和模型都一起存放到一个文件中,还有一种情况是模型单独一个文件而动画单独一个文件.这里我们就两种情况都看一下. 使用的资源是Unity3D自带的以及从一本教材中取出的两种类型的动画资源,同时需要

让我们再聊聊浏览器资源加载优化

让我们再聊聊浏览器资源加载优化 让我们再聊聊浏览器资源加载优化

各浏览器对页面外部资源加载的策略

这个总结来源于一次优化的请求,最初某个页面的加载十分缓慢,load事件迟迟无法触发,因此希望可以通过对静态文件分域名等方式对页面的外部资源进行优化,拿得load事件尽可能早地触发. 于是我查看了页面的源码,并对外部资源进行了整理,基于下面2个理念画出了一个推测的瀑布图: 1.浏览器对同一个域只能并发2个HTTP请求 – 网上盛传已久.2.javascript文件的加载会阻塞浏览器其他资源的加载 – 同样网上盛传已久. 然而,当我看到各浏览器中实际的瀑布图时,我知道自己又犯了一个简单的错误:太过相