示例#1
0
        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);
        }
示例#2
0
        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);
            }
        }