Ejemplo n.º 1
0
        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]);
        }
Ejemplo n.º 2
0
        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;
        }