您当前的位置: 首页 >  unity

染指流年灬

暂无认证

  • 5浏览

    0关注

    194博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity 加载 AB包的缓存问题

染指流年灬 发布时间:2019-03-26 17:23:00 ,浏览量:5

情况

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

关注
打赏
1665909078
查看更多评论
立即登录/注册

微信扫码登录

0.0604s