/// <summary> /// 更新主逻辑,用于执行Load队列 /// </summary> void Update() { if (mLoadingRequest.Count > 0) { for (int i = mLoadingRequest.Count - 1; i >= 0; i--) { if (mLoadingRequest[i].IsDone) { Debug.Log(mLoadingRequest[i].assetName + " is done"); ResRequestInfo info = mLoadingRequest[i]; AssetInfo aInfo = new AssetInfo(); aInfo.asset = info.Asset; aInfo.IsKeepInMemory = info.IsKeepInMemory; aInfo.name = info.assetName; info.SendEvent(EventDef.LoadAssetFinished, aInfo); mLoadingRequest.RemoveAt(i); Destroy(info); } } } if (mLoadingRequest.Count < SystemInfo.processorCount && mWaiting.Count > 0) { ResRequestInfo info = mWaiting.Dequeue(); mLoadingRequest.Add(info); Debug.Log("mWaiting dequeue :" + info.assetName); info.LoadAsync(); } }
/// <summary> /// 异步加载 /// </summary> /// <param name="assetName"></param> /// <param name="listener"></param> /// <param name="type"></param> /// <param name="isKeepInmemory"></param> private void _loadAsync(string assetName, IEventListener listener = null, Type type = null, bool isKeepInmemory = false) { foreach (ResRequestInfo info in mLoadingRequest) { if (info.assetName == assetName) { info.AddEventListener(EventDef.LoadAssetFinished, listener); return; } } foreach (ResRequestInfo i in mWaiting) { if (i.assetName == assetName) { i.AddEventListener(EventDef.LoadAssetFinished, listener); return; } } ResRequestInfo requestInfo = requestInfoContainer.AddComponent <ResRequestInfo>(); requestInfo.assetName = assetName; requestInfo.AddEventListener(EventDef.LoadAssetFinished, listener); requestInfo.AddEventListener(EventDef.LoadAssetFinished, this); requestInfo.IsKeepInMemory = isKeepInmemory; requestInfo.type = type; if (assetPathDic.ContainsKey(assetName)) { requestInfo.loadType = LoadType.assetBundleLoad; } else { requestInfo.loadType = LoadType.resourceLoad; } mWaiting.Enqueue(requestInfo); }