public async UniTask <bool> ExistsAsync(Uri uri, CancellationToken cancellationToken = default) { return(await ObservableUnityWebRequest.Head(uri.ToString()) .Select(_ => true) .Catch((ObservableUnityWebRequest.UnityWebRequestErrorException e) => Observable.Return(false)) .ToUniTask(cancellationToken)); }
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))); }
private static IObservable <AssetBundle> LoadSingleManifest(IURLResolver urlResolverSingleManifest) { Func <IObservable <AssetBundle> > createStream = () => AssetBundle.LoadFromFileAsync(CreateLocalSingleManifestPath()).AsAsyncOperationObservable().Select(assetBundleCreateRequest => assetBundleCreateRequest.assetBundle); if (!HasSingleManifest()) { return(ObservableUnityWebRequest .GetData(urlResolverSingleManifest.Resolve()) .Timeout(TimeSpan.FromSeconds(TIMEOUT_SECONDS)) .Retry(RETRY_COUNT) .Do(SaveSingleManifest) .SelectMany(_ => createStream())); } return(createStream()); }
/// <summary> /// Jenkins にビルドリクエストを発行する /// </summary> /// <param name="jobType">ジョブ種別</param> /// <param name="buildTarget">ビルドターゲット</param> public static void SendBuildRequest(JobType jobType, BuildTarget buildTarget) { if (!IsValid(jobType)) { return; } ObservableUnityWebRequest.Post(Path.Combine(Path.Combine(JenkinsSetting.GetOrDefault().BaseURL, JOB_NAME_MAP[jobType]), "buildWithParameters"), GenerateParameters(buildTarget), GenerateRequestHeader()).Subscribe( (_) => { Debug.Log("Build request sent to Jenkins."); }, (ex) => { Debug.Log("Could not send build request to Jenkins: " + ex.Message); } ); }
private static IObservable <AssetBundle> LoadSingleManifest(IURLResolver urlResolverSingleManifest) { Func <IObservable <AssetBundle> > createStream = () => AssetBundle.LoadFromFileAsync(CreateLocalSingleManifestPath()).AsAsyncOperationObservable().Select(assetBundleCreateRequest => assetBundleCreateRequest.assetBundle); if (!HasSingleManifest()) { return(ObservableUnityWebRequest .GetData(urlResolverSingleManifest.ResolveSingleManifest(ContextManager.CurrentProject.Name).ToString()) .Timeout(TimeSpan.FromSeconds(TimeoutSeconds)) .Retry(RetryCount) .Do(SaveSingleManifest) .SelectMany(_ => createStream())); } return(createStream()); }
/// <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()); }
/// <summary> /// Root AssetBundle をキャッシュしつつダウンロードする /// </summary> /// <returns>ダウンロードが完了した AssetBundle のインスタンスが流れるストリーム</returns> private IObservable <Unit> FetchRootAssetBundleAsObservable() { string rootAssetBundleManifestPath = Path.Combine(UnityEngine.Application.persistentDataPath, string.Format(EnvironmentSetting.Instance.AssetBundleCachePathFormat, this.RootAssetBundleName, UnityEngine.Application.version)); IObservable <UnityEngine.AssetBundle> stream; if (UnityEngine.Application.internetReachability == UnityEngine.NetworkReachability.NotReachable && File.Exists(rootAssetBundleManifestPath)) { stream = Observable .Return(UnityEngine.AssetBundle.LoadFromFile(rootAssetBundleManifestPath)); } else { stream = ObservableUnityWebRequest .GetUnityWebRequest(Manager.Instance.SourceProvider.DeterminateURL(this.RootAssetBundleName, true)) .Select( (unityWebRequest) => { if (!Directory.Exists(Path.GetDirectoryName(rootAssetBundleManifestPath)) && !string.IsNullOrEmpty(Path.GetDirectoryName(rootAssetBundleManifestPath))) { // ReSharper disable once AssignNullToNotNullAttribute Directory.CreateDirectory(Path.GetDirectoryName(rootAssetBundleManifestPath)); } File.WriteAllBytes(rootAssetBundleManifestPath, unityWebRequest.downloadHandler.data); #if UNITY_IOS && !UNITY_EDITOR // iOS 実機の場合、非ユーザデータを iCloud バックアップ対象から除外しないとリジェクトされます UnityEngine.iOS.Device.SetNoBackupFlag(rootAssetBundleManifestPath); #endif return(UnityEngine.AssetBundle.LoadFromFile(rootAssetBundleManifestPath)); } ); } return(stream.Select( (assetBundle) => { this.RootAssetBundleManifest = assetBundle.LoadAsset <UnityEngine.AssetBundleManifest>("AssetBundleManifest"); assetBundle.Unload(false); return Unit.Default; } )); }
public async UniTask DeleteAsync(Uri uri, CancellationToken cancellationToken = default) { await ObservableUnityWebRequest.DeleteAsObservable(uri.ToString()).ToUniTask(cancellationToken: cancellationToken); }
public async UniTask UpdateAsync(Uri uri, byte[] data, CancellationToken cancellationToken = default) { await ObservableUnityWebRequest.PutAsObservable(uri.ToString(), data).ToUniTask(cancellationToken: cancellationToken); }
public async UniTask <byte[]> ReadAsync(Uri uri, CancellationToken cancellationToken = default) { return(await ObservableUnityWebRequest.GetBytesAsObservable(uri.ToString()).ToUniTask(cancellationToken: cancellationToken)); }
public async UniTask WriteAsync(Uri uri, IEnumerable <byte> data, CancellationToken cancellationToken = default) { await ObservableUnityWebRequest.Put(uri.ToString(), data.ToArray()).ToUniTask(cancellationToken); }
public async UniTask <IEnumerable <byte> > ReadAsync(Uri uri, CancellationToken cancellationToken = default) { return(await ObservableUnityWebRequest.GetData(uri.ToString()).ToUniTask(cancellationToken)); }