/// <summary> /// 加载一个AB /// </summary> /// <param name="ABName">资源名称</param> /// <param name="callBack">回调函数</param> /// <param name="keepInMemory">是否常驻内存</param> /// <param name="Async">是否异步加载</param> public void LoadAB(string ABName, System.Action <AssetBundle> callBack = null , bool keepInMemory = false, bool Async = false) { if (mCacheABDic.ContainsKey(ABName)) { if (callBack != null) { callBack(mCacheABDic[ABName].ab); } } else { if (Async) { foreach (LoadPack load in mLoading) { if (load.info.abName == ABName) { load.AddListener(callBack); return; } } foreach (LoadPack load in mWaitLoad) { if (load.info.abName == ABName) { load.AddListener(callBack); return; } } LoadPack loadPack = new LoadPack(); loadPack.info = new PackInfo(name, null, keepInMemory); loadPack.AddListener(callBack); mWaitLoad.Enqueue(loadPack); } else { AssetBundle ab = AssetBundle.LoadFromFile(AppConst.AppExternalDataPath + "/" + ABName + AppConst.ExtName); PackInfo info = new PackInfo(ABName, ab, keepInMemory); mCacheABDic[info.abName] = info; if (callBack != null) { callBack(mCacheABDic[ABName].ab); } } } }
public override void OnUpdate() { while (mWaitLoad.Count > 0 && mLoading.Count <= SystemInfo.processorCount) { LoadPack pack = mWaitLoad.Dequeue(); mLoading.Add(pack); pack.Load(); } if (mLoading.Count > 0) { for (int i = mLoading.Count - 1; i >= 0; i--) { if (mLoading[i].IsDone) { mLoading[i].info.ab = mLoading[i].request.assetBundle; mLoading[i].CallBack(); mCacheABDic.Add(mLoading[i].info.abName, mLoading[i].info); mLoading.RemoveAt(i); } } } }