public void AsyncLoadResource(string path, OnLoadResFinish dealFinish, LoadResPriority priority, object param1 = null, object param2 = null, object param3 = null, uint crc = 0) { if (crc == 0) { crc = Crc32.GetCrc32(path); } ResourceItem item = GetCacheResourceItem(crc); if (item != null) { if (dealFinish != null) { dealFinish(path, item.m_Obj, param1, param2, param3); } return; } //判断是否在加载中 AsyncLoadResInfo para = null; if (!m_LoadingAssetDic.TryGetValue(crc, out para) || para == null) { para = m_AsyncLoadResParamPool.Spawn(); para.m_Crc = crc; para.m_Path = path; para.m_Priority = priority; m_LoadingAssetDic.Add(crc, para); m_LoadingAssetList[(int)priority].Add(para); } //往回调列表里面加回调 AsyncLoadResCallBackInfo callBack = m_AsyncCallBackPool.Spawn(); callBack.m_DealFinish = dealFinish; callBack.m_Param1 = param1; callBack.m_Param2 = param2; callBack.m_Param3 = param3; para.m_CallBackList.Add(callBack); }
//异步加载协程 IEnumerator AsyncLoadCor() { //回调队列 List <AsyncLoadResCallBackInfo> callBackList = null; long lastYieldTime = System.DateTime.Now.Ticks; while (true) { bool haveYield = false; //遍历需加载资源队列 for (int i = 0; i < (int)LoadResPriority.RES_NUM; i++) { List <AsyncLoadResInfo> loadingList = m_LoadingAssetList[i]; if (loadingList.Count <= 0) { continue; } AsyncLoadResInfo loadingItem = loadingList[0]; loadingList.RemoveAt(0); //取出回调 callBackList = loadingItem.m_CallBackList; Object obj = null; ResourceItem item = null; #if UNITY_EDITOR if (!m_loadFromAssetBundle) { obj = LoadAssetByEditor <Object>(loadingItem.m_Path); //模拟异步加载 yield return(new WaitForSeconds(0.5f)); item = AssetBundleMgr.Instance.GetResourceItem(loadingItem.m_Crc); } #endif if (obj == null) { item = AssetBundleMgr.Instance.LoadResourceAssetBundle(loadingItem.m_Crc); if (item != null && item.m_AssetBundle != null) { AssetBundleRequest abRequest = null; if (loadingItem.isSprite) { abRequest = item.m_AssetBundle.LoadAssetAsync <Sprite>(item.m_AssetName); } else { abRequest = item.m_AssetBundle.LoadAssetAsync(item.m_AssetName); } yield return(abRequest); if (abRequest.isDone) { obj = abRequest.asset; } lastYieldTime = System.DateTime.Now.Ticks; } } CacheResource(loadingItem.m_Path, ref item, loadingItem.m_Crc, obj, callBackList.Count); for (int j = 0; j < callBackList.Count; j++) { AsyncLoadResCallBackInfo callBack = callBackList[j]; if (callBack != null && callBack.m_DealFinish != null) { callBack.m_DealFinish(loadingItem.m_Path, obj, callBack.m_Param1, callBack.m_Param2, callBack.m_Param3);//执行回调 callBack.m_DealFinish = null; } callBack.Reset(); m_AsyncCallBackPool.Recycle(callBack); } obj = null; callBackList.Clear(); m_LoadingAssetDic.Remove(loadingItem.m_Crc); loadingItem.Reset(); m_AsyncLoadResParamPool.Recycle(loadingItem); if (System.DateTime.Now.Ticks - lastYieldTime > MAXLOADRESTIME)//大于这个时间等待一帧 { yield return(null); lastYieldTime = System.DateTime.Now.Ticks; haveYield = true; } } if (!haveYield || System.DateTime.Now.Ticks - lastYieldTime > MAXLOADRESTIME)//大于这个时间等待一帧 { lastYieldTime = System.DateTime.Now.Ticks; } yield return(null); } }