示例#1
0
 private IObservable <AssetBundle> LoadAsObservable(string assetBundleName)
 {
     if (this.LoadedAssetBundleMap.ContainsKey(assetBundleName))
     {
         return(Observable.Return(this.LoadedAssetBundleMap[assetBundleName]));
     }
     return(ObservableUnityWebRequest
            .GetAssetBundle(this.URLResolverNormal.Resolve(assetBundleName), 0)
            .Do(assetBundle => this.LoadedAssetBundleMap[assetBundleName] = assetBundle)
            .Timeout(TimeSpan.FromSeconds(TIMEOUT_SECONDS)));
 }
示例#2
0
 public IObservable <AssetBundle> LoadAsObservable(string assetBundleName)
 {
     if (LoadedAssetBundleMap.ContainsKey(assetBundleName))
     {
         return(Observable.Return(LoadedAssetBundleMap[assetBundleName]));
     }
     return(ObservableUnityWebRequest
            .GetAssetBundle(ResolveAssetBundleURL(assetBundleName), ResolveAssetBundleHash(assetBundleName), 0)
            .Do(assetBundle => LoadedAssetBundleMap[assetBundleName] = assetBundle)
            .Timeout(TimeSpan.FromSeconds(TimeoutSeconds)));
 }
示例#3
0
        /// <summary>
        /// AssetBundle をダウンロードする
        /// </summary>
        /// <param name="assetBundleName">AssetBundle 名</param>
        /// <param name="shouldUnloadImmediately">自動 Unload するかどうか</param>
        /// <returns>ダウンロードが完了した AssetBundle のインスタンスが流れるストリーム</returns>
        private IObservable <UnityEngine.AssetBundle> FetchAssetBundleAsObservable(string assetBundleName, bool shouldUnloadImmediately)
        {
            ScheduledNotifier <float> scheduledNotifier = new ScheduledNotifier <float>();

            scheduledNotifier.Subscribe(x => this.ProgressNotifier.Report(assetBundleName, x));
            return(ObservableUnityWebRequest
                   .GetAssetBundle(
                       Manager.Instance.SourceProvider.DeterminateURL(assetBundleName),
                       this.RootAssetBundleManifest.GetAssetBundleHash(assetBundleName),
                       0,
                       null,
                       scheduledNotifier
                       )
                   .Select(
                       (assetBundle) => {
                // 保持している他のバージョンキャッシュを削除する
                this.ClearOtherCachedVersions(assetBundle.name);

                // AssetBundle 単位の依存 AssetBundle 名マップに依存 AssetBundle を保存
                this.AssetBundleDependencieListMap[assetBundle.name] = this.RootAssetBundleManifest.GetAllDependencies(assetBundle.name).ToList();
                if (assetBundle.isStreamedSceneAssetBundle)
                {
                    /* StreamedSceneAssetBundle の場合は AssetBundle 名を保持しておく */
                    string sceneName = Path.GetFileNameWithoutExtension(assetBundle.GetAllScenePaths().ToList().First());
                    if (!string.IsNullOrEmpty(sceneName))
                    {
                        this.SceneAssetBundleNameMap[sceneName] = assetBundle.name;
                    }
                }
                if (shouldUnloadImmediately)
                {
                    assetBundle.Unload(true);
                    return null;
                }
                this.TemporaryLoadedAssetBundleList.Add(assetBundle);
                return assetBundle;
            }
                       ));
        }
示例#4
0
 public IObservable <Unit> DownloadAllAsObservable()
 {
     return(this
            // SingleManfiest を読み込む
            .LoadSingleManifestAsObservable()
            .SelectMany(
                _ => this
                .SingleManifest
                // 全ての AssetBundle 名を取得
                .GetAllAssetBundles()
                .Select(
                    assetBundleName => Observable
                    // 並列処理待ち
                    .FromCoroutine(this.WaitParallelDownload)
                    // 並列カウントをインクリメント
                    .Do(__ => this.ParallelDownloadCount.Value++)
                    // UnityWebRequest に変換
                    .SelectMany(
                        __ => {
         if (this.LoadedAssetBundleMap.ContainsKey(assetBundleName))
         {
             return Observable.Return(this.LoadedAssetBundleMap[assetBundleName]);
         }
         return ObservableUnityWebRequest
         .GetAssetBundle(this.URLResolverNormal.Resolve(assetBundleName), this.SingleManifest.GetAssetBundleHash(assetBundleName), 0, null, this.GetProgress(assetBundleName))
         // 読み込み完了時に読み込み済マップに入れておく
         //   AssetBundle を開きっぱなしにしておくコストは殆ど無いとのことなので、Unload は原則行わない
         //   See also: http://tsubakit1.hateblo.jp/entry/2016/08/23/233604 の「SceneをAssetBundleに含める方法」セクションの最後
         .Do(assetBundle => this.LoadedAssetBundleMap[assetBundleName] = assetBundle)
         .Timeout(TimeSpan.FromSeconds(TIMEOUT_SECONDS));
     })
                    // OnError にせよ OnCompleted にせよ「完了」したら並列ダウンロード数をデクリメント
                    .Finally(() => this.ParallelDownloadCount.Value--)
                    )
                .WhenAll()
                )
            .AsUnitObservable());
 }