Unity 加载 AB包的缓存问题
Unity 如果重复加载相同的ab包 并且加载包之后没有去将assetbundle unload如果没有检测机制去避免 会报错The AssetBundle ‘Memory’ can’t be loaded because another AssetBundle with the same files is already loaded.这时需要添加检测机制AssetBundle[] ...
情况
在Unity中,如果重复加载相同的ab包 并且加载包之后没有去将assetbundle unload
或者在assetbundle unload调用几帧内去加载另一个同名的assetbundle。
就会报错
The AssetBundle ‘Memory’ can’t be loaded because another AssetBundle with the same files is already loaded.
只要两个ab包里面的物体的名字 一样,不管这两个ab包里面的物体是否一样,就会报这个错。
在一些同名就代表同个物体的项目中的避免方法
可以需要添加检测机制
AssetBundle[] loadedABs = Resources.FindObjectsOfTypeAll<AssetBundle>();
if (loadedABs != null)
{
foreach (var item in loadedABs)
{
if (item.Contains(assetName))
{
//Debug.LogError("isExis ----------------------");
existAB = item;
}
}
}
去找到之前加载过的assetbundle
上面这个方法只适用于项目中每个assetbundle里面的物体名字不同的情况。
如果两个ab包的名字完全相同 就会找到之前加载的ab包
意味着如果想加载的ab包的内容不一样 但是名字一样的话
只能加载第一次加载的ab包的内容
这时我试过了使用hashtable 保存加载的url以及 对应的ab包,
然后每次加载的时候,通过url来判断是否已经有加载过的ab包。
这个方法能避免上述问题
如果上述代码被注释了 还是会 报开始时候的错误
还有一个解决办法就是 ab包加载后卸载掉
这个方法的优点就是能避免上述两种情况
弊端就是每次加载都需要 重新从网上下载
更新于2022.4.18 ,将之前的描述整理了一下。
另外在目前的项目中,遇到了即使ab包里面的物体的名字相同,其实也不是同个物体,并且这种情况是项目的一个规则。
所以对于自己的ab包工具类扩展了一个专门针对这种情况的写法:排队加载ab包。
用排队加载的方式
解决要加载的ab包名字和ab包内容名字与正在加载的ab包名字和内容名字相同引起的报错。
排队过程中,每次加载ab包内容资源结束后,会调用assetbundle.unload
assetbundle.unload调用过后要能等待一帧才能进行队列中下一个ab包的加载
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)