情况

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