Unity 加载 AB包的缓存问题

情况

在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包的加载

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

染指流年丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值