protected IObservable <T> GetBundleFromStreamingAssets <T>(BundleRequest bundleNeeded) where T : UnityEngine.Object
        {
            Debug.Log(("AssetBundleLoader: Using StreamingAssets - " + " Requesting:" + bundleNeeded.AssetCategory + " | " + bundleNeeded.BundleName).Colored(Colors.aqua));
            string path = Path.Combine(Application.streamingAssetsPath, bundleNeeded.AssetPathFromLocalStreamingAssets);

            return(Observable.FromCoroutine <T>((observer, cancellationToken) => RunAssetBundleCreateRequestOperation <T>(AssetBundle.LoadFromFileAsync(path), bundleNeeded, observer, cancellationToken)));
        }
        protected IObservable <T> ProcessDownloadedBundle <T>(BundleRequest bundleNeeded, LoadedBundle bundle) where T : UnityEngine.Object
        {
            if (!downloadedBundles.ContainsKey(bundleNeeded.BundleName))
            {
                downloadedBundles.Add(bundleNeeded.BundleName, bundle);
            }

            return(bundle.LoadAssetAsync <T>(bundleNeeded.AssetName));
        }
        protected void LoadGameBundle()
        {
            BundleRequest game = new BundleRequest(AssetCategoryRoot.None, AssetBundleUtilities.ClientPlatform.ToString(), AssetBundleUtilities.ClientPlatform.ToString());

            Resources.UnloadUnusedAssets();

            if (!configuration.UseCache)
            {
                Caching.ClearCache();
            }
        }
        protected IObservable <T> GetBundle <T>(BundleRequest bundleNeeded) where T : UnityEngine.Object
        {
#if UNITY_EDITOR
            if (EditorPreferences.EDITORPREF_SIMULATE_ASSET_BUNDLES)
            {
                return(Observable.FromCoroutine <T>((observer, cancellationToken) => SimulateAssetBundle <T>(bundleNeeded, observer, cancellationToken)));
            }
#endif
            if (!assetService.UseStreamingAssets)
            {
                return(Observable.FromCoroutine <T>((observer, cancellationToken) => GetBundleFromWebOrCacheOperation <T>(bundleNeeded, observer, cancellationToken)));
            }
            else
            {
                return(GetBundleFromStreamingAssets <T>(bundleNeeded));
            }
        }
        protected IEnumerator GetBundleFromWebOrCacheOperation <T>(BundleRequest bundleNeeded, IObserver <T> observer, CancellationToken cancellationToken) where T : UnityEngine.Object
        {
            UnityWebRequest www          = null;
            ManifestInfo    manifestInfo = new ManifestInfo(bundleNeeded);
            AssetBundle     bundle;

            Debug.Log(("AssetBundleLoader: " + bundleNeeded.AssetCacheState + " | Requesting: " + bundleNeeded.AssetName + " | " + bundleNeeded.BundleName).Colored(Colors.aqua));

            if (bundleNeeded.AssetCacheState.Equals(bundleNeeded.AssetCacheState))
            {
                yield return(manifestInfo.GetInfo().ToYieldInstruction());

                www = UnityWebRequest.GetAssetBundle(bundleNeeded.AssetPath, manifestInfo.Hash, 0);
            }
            else
            {
                www = UnityWebRequest.GetAssetBundle(bundleNeeded.AssetPath);
            }

            yield return(www.SendWebRequest());

            bundle = DownloadHandlerAssetBundle.GetContent(www);

            if (www.isNetworkError)
            {
                observer.OnError(new System.Exception("AssetBundleLoader: " + www.error));
            }
            else
            {
                ProcessDownloadedBundle <T>(bundleNeeded, new LoadedBundle(bundle, manifestInfo))
                .Subscribe(xs =>
                {
                    observer.OnNext(xs);
                    observer.OnCompleted();
                });
            }

            www.Dispose();
        }
        protected IEnumerator SimulateAssetBundle <T>(BundleRequest bundleNeeded, IObserver <T> observer, CancellationToken cancellationToken) where T : UnityEngine.Object
        {
            Debug.Log(("AssetBundleLoader: Simulated | Requesting: " + bundleNeeded.AssetName + " | " + bundleNeeded.BundleName).Colored(Colors.aqua));

            List <T> assets = new List <T>();
            var      guids  = UnityEditor.AssetDatabase.FindAssets(bundleNeeded.BundleName);

            foreach (var id in guids)
            {
                var path  = AssetDatabase.GUIDToAssetPath(id);
                var asset = UnityEditor.AssetDatabase.LoadAssetAtPath <T>(path);
                if (asset && asset.name.ToLower().Equals(bundleNeeded.BundleName.ToLower()))
                {
                    assets.Add(asset);
                    break;
                }

                yield return(null);
            }

            observer.OnNext(assets.First());
            observer.OnCompleted();
        }
 public IObservable <T> GetAndLoadAsset <T>(BundleRequest bundleNeeded) where T : UnityEngine.Object
 {
     return(assetBundlebundleLoader.LoadAsset <T>(bundleNeeded));
 }
 public ManifestInfo(BundleRequest bundleNeeded)
 {
     bundle = bundleNeeded;
 }
        protected IEnumerator RunAssetBundleCreateRequestOperation <T>(UnityEngine.AssetBundleCreateRequest assetBundleCreateRequest, BundleRequest bundleNeeded, IObserver <T> observer, CancellationToken cancellationToken) where T : UnityEngine.Object
        {
            while (!assetBundleCreateRequest.isDone && !cancellationToken.IsCancellationRequested)
            {
                yield return(null);
            }

            ProcessDownloadedBundle <T>(bundleNeeded, new LoadedBundle(assetBundleCreateRequest.assetBundle))
            .Subscribe(xs =>
            {
                if (!xs)
                {
                    observer.OnError(new System.Exception("RunAssetBundleCreateRequestOperation: Error getting bundle " + bundleNeeded.AssetName));
                }

                observer.OnNext(xs);
                observer.OnCompleted();
            });
        }