The AssetBundle 'journeyweekend3_2.asset' can't be loaded because another AssetBundle with the same files is already loaded。
项目在调用AssetBundle.LoadFromFileAsync接口时报了上面的错误.
上面这种错误提示,网上很多说法是不同目录下存在同一个assetbundle文件,两个都加载时会报上面的错误,但是我在项目中确定了没有两个同名文件,但还是报了上面的错误,冥思苦想而不得其解,后来经过仔细分析,终于最后搞定了。
项目中的实际情况是这样的,UI在显示时,有的图片并非来自安装包,而是需要从资源服务器进行下载,下载完毕后再把图片设置到UI上。那么这个AssetBundle包(里面只有一张图片)就是从资源服务器上下载的,但下载完毕后会触发一个下载完毕的事件,那么UI在监听到这个事件后会设置UI上的图片,该图片来自上面的AssetBundle包,此时UI收到下载完毕的监听事件后会立马加载并解析刚刚下载好的AssetBundle包,此时加载此AssetBundle包时报了上面的错误。
发生上述错误的原因是下载完毕和加载AssetBundle包是在同一帧进行的,其实在下载完毕时AssetBundle包内容是存在内存的,此时需要在本地磁盘创建文件对其进行写操作,将AssetBundle包内容写入到这个文件里,由于这个时候文件系统没有完全释放,内存里其实还存在一份AssetBundle文件,此时再调用AssetBundle.LoadFromFileAsync接口时,会认为此文件已经被加载了,所以会报上面的错误。
解决办法:
在调用AssetBundle.LoadFromFileAsync接口前等待文件系统释放完毕即可,可在调用此接口前加上yield return new WaitForSeconds(0.1f)即可,试过等待一帧还是会报错,所以就等待了0.1秒,然后顺利解决问题,在此记录一下。