private static IEnumerator LoadAssetBundleAsyncInternal(string bundleName, Action <AssetBundle> onLoaded) { int loadingCount = 0; LoadingAssetBundle loadingAssetBundle; if (Manifest) { //Load all dependencies AssetBundle string[] dependencies = Manifest.GetAllDependencies(GetAssetBundleName(bundleName)); for (int i = 0; i < dependencies.Length; i++) { var dependencyBundleName = dependencies[i]; if (dependencyBundleName == null) { Debug.LogError($"Load LoadAssetBundleAsync {bundleName} error: Dependency name is Null!"); continue; } var bundleNameWithoutExtension = Path.GetFileNameWithoutExtension(dependencyBundleName); //Already loaded if (mAssetBundleDict.ContainsKey(bundleNameWithoutExtension)) { continue; } loadingCount++; //Not loading if (!mLoadingAssetBundleDict.TryGetValue(bundleNameWithoutExtension, out loadingAssetBundle)) { //Add to loading loadingAssetBundle = new LoadingAssetBundle(bundleNameWithoutExtension, AssetBundle.LoadFromFileAsync(GetAssetBundlePath(dependencyBundleName, false))); } loadingAssetBundle.Completed += _ => loadingCount--; } } //Not loading if (!mLoadingAssetBundleDict.TryGetValue(bundleName, out loadingAssetBundle)) { var assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(GetAssetBundlePath(bundleName)); if (assetBundleCreateRequest == null) { Debug.LogError($"Load LoadAssetBundleAsync {bundleName} error: Null AssetBundleCreateRequest!"); mAssetBundleDict[bundleName] = null; onLoaded?.Invoke(null); yield break; } //Add to loading loadingAssetBundle = new LoadingAssetBundle(bundleName, assetBundleCreateRequest); } loadingCount++; loadingAssetBundle.Completed += _ => loadingCount--; //Wait for loading finished. while (loadingCount > 0) { yield return(null); } onLoaded?.Invoke(mAssetBundleDict[bundleName]); }
private static void LoadAssetBundleAsyncInternal(string bundleName, Action <AssetBundle> onLoaded) { int loadingCount = 1; void OnCompleted(AssetBundle _) { loadingCount--; if (loadingCount <= 0) { onLoaded?.Invoke(mLoadedAssetBundleDict[bundleName].AssetBundle); } } LoadedAssetBundle loadedAssetBundle; LoadingAssetBundle loadingAssetBundle; if (Manifest) { //Load all dependencies AssetBundle string[] dependencies = Manifest.GetAllDependencies(GetAssetBundleName(bundleName)); for (int i = 0, len = dependencies.Length; i < len; i++) { var dependencyBundleName = dependencies[i]; if (dependencyBundleName == null) { Debug.LogError($"Load LoadAssetBundleAsync {bundleName} error: Dependency name is Null!"); continue; } var bundleNameWithoutExtension = Path.GetFileNameWithoutExtension(dependencyBundleName); //Already loaded if (mLoadedAssetBundleDict.TryGetValue(bundleNameWithoutExtension, out loadedAssetBundle)) { //Add Reference loadedAssetBundle.AddReference(bundleName); continue; } loadingCount++; //Not loading if (!mLoadingAssetBundleDict.TryGetValue(bundleNameWithoutExtension, out loadingAssetBundle)) { //Add to loading loadingAssetBundle = new LoadingAssetBundle(bundleNameWithoutExtension, bundleName, AssetBundle.LoadFromFileAsync(GetAssetBundlePath(dependencyBundleName, false))); } else { //Add Reference loadingAssetBundle.AddReference(bundleName); } loadingAssetBundle.Completed += OnCompleted; } } //Double check if (mLoadedAssetBundleDict.TryGetValue(bundleName, out loadedAssetBundle)) { //Add Reference loadedAssetBundle.AddReference(bundleName); onLoaded?.Invoke(loadedAssetBundle.AssetBundle); return; } //Not loading if (!mLoadingAssetBundleDict.TryGetValue(bundleName, out loadingAssetBundle)) { var assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(GetAssetBundlePath(bundleName)); if (assetBundleCreateRequest == null) { Debug.LogError($"Load LoadAssetBundleAsync {bundleName} error: Null AssetBundleCreateRequest!"); mLoadedAssetBundleDict[bundleName] = null; onLoaded?.Invoke(null); return; } //Add to loading loadingAssetBundle = new LoadingAssetBundle(bundleName, bundleName, assetBundleCreateRequest); } else { //Add Reference loadingAssetBundle.AddReference(bundleName); } loadingAssetBundle.Completed += OnCompleted; }