public void AsyncLoad(string url, AsyncLoadCallBack.CallBack onAsyncRequestCallBack, object context) { url = url + GetExtension( ); //UnityEngine.Debug.Log( string.Format( " ## {0}", url ) ); AssetBundleCache cab = _cacheMgr.GetAssetBundle(url); if (cab == null) { CreateRequest(url, onAsyncRequestCallBack, context); return; } // 缓存中已有AB数据,检查一下依赖项量是否完成(有可能正在加载) string[] dependsObj = GetAbDependencies(url); if (dependsObj == null) { // 没有依赖项,缓存中已有AB数据,直接回调 if (onAsyncRequestCallBack != null) { onAsyncRequestCallBack(context, cab.AB); } return; } // 遍历依赖项是否在缓存中 bool isOk = true; foreach (var one in dependsObj) { if (_cacheMgr.GetAssetBundle(one) != null) { continue; } isOk = false; break; } if (isOk) { // 缓存中有全部数据,直接回调 if (onAsyncRequestCallBack != null) { onAsyncRequestCallBack(context, cab.AB); } return; } // AB包不全,需要创建requset CreateRequest(url, onAsyncRequestCallBack, context); }
private void CreateRequest(string url, AsyncLoadCallBack.CallBack onAsyncRequestCallBack, object context) { // ①:先创建一个回调 AsyncLoadCallBack callbackFun = new AsyncLoadCallBack(onAsyncRequestCallBack, context); // ③是否已有加载数据,已有,注册一个回调函数,等待返回 if (_requests.ContainsKey(url)) { _requests[url].Callbacks.Add(callbackFun); return; } // ②:没有加载相关数据,新建一个异步请求,注册一个回调函数 // url可能已存在于缓存,需要请求的是依赖项 AsyncLoadRequest request = new AsyncLoadRequest(url, AssetBundleMgr.GetInstance( ).GetAbDependencies(url)); request.Callbacks.Add(callbackFun); _requests.Add(url, request); AssetBundle ab = GetAb(url); if (ab == null) { RegisterLoadedCallBack(url, request.UrlLoadedCallBack); } else { // 主ab包已经加载了,需要加载的是依赖包 string depsUrl = request.GetUnLoadUrl( ); RegisterLoadedCallBack(depsUrl, request.UrlLoadedCallBack); url = depsUrl; } // ④:没有正在下载的相同url,排个队 if (!IsLoading(url)) { _waitingQueue.Enqueue(url); } }