IEnumerator OnAssetBundleLoadedAsync(LoaderResult result) { string assetBundleName = result.AssetBundleRecord.AssetBundleName; AssetBundleRecord assetBundleRecord; if (!loadingAssetBundleRecords.TryGetValue(assetBundleName, out assetBundleRecord)) { errorReceiver.OnError(AssetBundleErrorCode.MissingLoadingAssetBundleRecord, $"cannot find loading asset bundle record: {assetBundleName}"); yield break; } byte[] bytes = Decrypt(result.Bytes); if (bytes == null) { errorReceiver.OnError(AssetBundleErrorCode.FailureToDecrypt, $"cannot decrypt asset bundle: {assetBundleName}"); yield break; } uint crc = assetBundleRecord.Crc; var assetBundleRequest = AssetBundle.LoadFromMemoryAsync(bytes, crc); while (!assetBundleRequest.isDone) { yield return(null); } AssetBundle assetBundle = assetBundleRequest.assetBundle; if (assetBundle == null) { errorReceiver.OnError(AssetBundleErrorCode.FailureToGetAssetBundle, $"cannot get asset bundle: {assetBundleName}"); yield break; } loadedAssetBundles.Add(assetBundleName, assetBundle); if (!loadingAssetBundleRecords.TryRemove(assetBundleName)) { errorReceiver.OnError(AssetBundleErrorCode.FailureToRemoveLoadingAssetBundleRecord, $"cannot remove loading asset bundle record: {assetBundleName}"); yield break; } HashSet <int> taskIds; if (!loadingTaskIdSets.TryGetValue(assetBundleName, out taskIds)) { errorReceiver.OnError(AssetBundleErrorCode.MissingTaskIdSetInCheckingCompletion, $"cannot get task id set: {assetBundleName}"); yield break; } List <IEnumerator> enumeratorsToGetAsset = ListPool <IEnumerator> .Pool.Get(); foreach (int taskId in taskIds) { LoadingTask?nullableLoadingTask = loadingTasks.GetNullableValue(taskId); if (!nullableLoadingTask.HasValue) { errorReceiver.OnError(AssetBundleErrorCode.MissingLoadingTask, $"cannot get loading task: {assetBundleName}"); yield break; } LoadingTask loadingTask = nullableLoadingTask.Value; if (loadingTask.NecessaryAssetBundleRecords.All(r => loadedAssetBundles.ContainsKey(r.AssetBundleName))) { enumeratorsToGetAsset.Add(loadingTask.EnumeratorToGetAsset); } } foreach (IEnumerator enumerator in enumeratorsToGetAsset) { coroutineOwner.Run(enumerator); } ListPool <IEnumerator> .Pool.Put(ref enumeratorsToGetAsset); }
void AddLodingTask <T>( AssetEntryRecord assetEntryRecord, IReadOnlyList <AssetBundleRecord> necessaryAssetBundleRecords, Action <T> onLoaded, Func <AssetBundle, AssetEntryRecord, AsyncOperationSet> getAssetBundleRequestFunc, Func <AssetBundleRequest, T> getAssetFunc) { if (isDestructed) { return; } int loadingTaskId = loadingTaskIdGenerator.Get(); IEnumerator enumeratorToGetAsset = GetAsset( loadingTaskId, assetEntryRecord, necessaryAssetBundleRecords, onLoaded, getAssetBundleRequestFunc, getAssetFunc); var loadingTask = new LoadingTask(necessaryAssetBundleRecords, enumeratorToGetAsset); loadingTasks.Add(loadingTaskId, loadingTask); foreach (AssetBundleRecord assetBundleRecord in necessaryAssetBundleRecords) { string assetBundleName = assetBundleRecord.AssetBundleName; HashSet <int> taskIds; if (!loadingTaskIdSets.TryGetValue(assetBundleName, out taskIds)) { taskIds = HashSetPool <int> .Pool.Get(); loadingTaskIdSets.Add(assetBundleName, taskIds); } taskIds.Add(loadingTaskId); } if (loadingTask.NecessaryAssetBundleRecords.All(r => loadedAssetBundles.ContainsKey(r.AssetBundleName))) { coroutineOwner.Run(loadingTask.EnumeratorToGetAsset); return; } foreach (AssetBundleRecord assetBundleRecord in loadingTask.NecessaryAssetBundleRecords) { string assetBundleName = assetBundleRecord.AssetBundleName; if (loadedAssetBundles.ContainsKey(assetBundleName)) { continue; } if (loadingAssetBundleRecords.ContainsKey(assetBundleName)) { continue; } loadingAssetBundleRecords.Add(assetBundleName, assetBundleRecord); storageChecker.Load(assetBundleRecord, onAssetBundleLoaded); } }