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))); }
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))); }
/// <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; } )); }
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()); }