/// <summary> /// 取消加载 /// 如果正在加载中 加载成功之后会卸载,同时回调也不会触发 /// </summary> /// <param name="requestId"></param> /// <returns></returns> public static void CancelLoadAssetAsync(int requestId) { LoadAssetInfo loadAssetInfo = GetLoadAssetInfo(requestId); if (loadAssetInfo == null) { return; } // 等待加载状态中 直接回收(如果不回收将会先加载在卸载) if (loadAssetInfo.step == LoadAssetStep.LoadWait) { RecoveryLoadAssetInfo(loadAssetInfo); } else { PendingLoadAssetInfo pendingLoadAssetInfo = _pendingLoadAssetInfoList[loadAssetInfo.bundleName]; // 资源还未加载 因为在加载依赖的bundle if (pendingLoadAssetInfo != null) { // 取消依赖加载bundle RequestLoadBundle.CancelLoadBundleAsync(pendingLoadAssetInfo.reqeustId); RecoveryPendingLoadAssetInfo(pendingLoadAssetInfo); // 这时资源还未加载 直接回收 RecoveryLoadAssetInfo(loadAssetInfo); } } }
/// <summary> /// bundle成功加载后的回调 /// </summary> /// <param name="bundleName"></param> /// <param name="assetBundle"></param> /// <param name="abRequestId"></param> private static void OnLoadPeningBundle(string bundleName, AssetBundle assetBundle, int abRequestId) { if (bundleName != assetBundle.name) { return; } PendingLoadAssetInfo peningInfo = _pendingLoadAssetInfoList[bundleName]; if (peningInfo == null) { return; } foreach (LoadAssetInfo loadAssetInfo in _loadAssetInfoList) { if (loadAssetInfo.bundleName == bundleName) { // 进入加载资源状态 loadAssetInfo.assetBundle = assetBundle; LoadAssetAsync(loadAssetInfo); } } // 回收依赖信息 RecoveryPendingLoadAssetInfo(peningInfo); }
/// <summary> /// 回收依赖加载信息 /// </summary> /// <param name="info"></param> private static void RecoveryPendingLoadAssetInfo(PendingLoadAssetInfo info) { if (info == null) { return; } info.Clear(); _freePendingLoadAssetInfoList.Add(info); }
/// <summary> /// 回收依赖加载信息 /// </summary> /// <param name="info"></param> private static void RecoveryPendingLoadAssetInfo(PendingLoadAssetInfo info) { if (info == null) { return; } if (_pendingLoadAssetInfoList.ContainsKey(info.bundleName)) { _pendingLoadAssetInfoList.Remove(info.bundleName); } info.Clear(); _freePendingLoadAssetInfoList.Add(info); }
/// <summary> /// 获取依赖加载信息 /// </summary> /// <returns></returns> private static PendingLoadAssetInfo GetTempPendingLoadAssetInfo() { PendingLoadAssetInfo assetInfo = null; if (_freePendingLoadAssetInfoList.Count > 0) { assetInfo = _freePendingLoadAssetInfoList[0]; _freePendingLoadAssetInfoList.RemoveAt(0); } else { assetInfo = new PendingLoadAssetInfo(); } return(assetInfo); }
/// <summary> ///依赖bundle加载状态 /// </summary> /// <param name="loadAssetInfo"></param> private static void PushPending(LoadAssetInfo loadAssetInfo) { EnterLoadDepend(loadAssetInfo); string bundleName = loadAssetInfo.bundleName; if (!_pendingLoadAssetInfoList.ContainsKey(bundleName)) { // 加载bundle int abRequestId = ResourceUtils.CreateAssetBundleAsync(bundleName, OnLoadPeningBundle); PendingLoadAssetInfo pendingInfo = new PendingLoadAssetInfo(); pendingInfo = GetTempPendingLoadAssetInfo(); pendingInfo.reqeustId = abRequestId; pendingInfo.bundleName = bundleName; _pendingLoadAssetInfoList.Add(bundleName, pendingInfo); } }