示例#1
0
 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));
 }
示例#2
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)));
 }
示例#3
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)));
 }
示例#4
0
        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());
        }
示例#5
0
 /// <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);
     }
         );
 }
示例#6
0
        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());
        }
示例#7
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;
            }
                       ));
        }
示例#8
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());
 }
示例#9
0
        /// <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;
            }
                       ));
        }
示例#10
0
 public async UniTask DeleteAsync(Uri uri, CancellationToken cancellationToken = default)
 {
     await ObservableUnityWebRequest.DeleteAsObservable(uri.ToString()).ToUniTask(cancellationToken: cancellationToken);
 }
示例#11
0
 public async UniTask UpdateAsync(Uri uri, byte[] data, CancellationToken cancellationToken = default)
 {
     await ObservableUnityWebRequest.PutAsObservable(uri.ToString(), data).ToUniTask(cancellationToken: cancellationToken);
 }
示例#12
0
 public async UniTask <byte[]> ReadAsync(Uri uri, CancellationToken cancellationToken = default)
 {
     return(await ObservableUnityWebRequest.GetBytesAsObservable(uri.ToString()).ToUniTask(cancellationToken: cancellationToken));
 }
示例#13
0
 public async UniTask WriteAsync(Uri uri, IEnumerable <byte> data, CancellationToken cancellationToken = default)
 {
     await ObservableUnityWebRequest.Put(uri.ToString(), data.ToArray()).ToUniTask(cancellationToken);
 }
示例#14
0
 public async UniTask <IEnumerable <byte> > ReadAsync(Uri uri, CancellationToken cancellationToken = default)
 {
     return(await ObservableUnityWebRequest.GetData(uri.ToString()).ToUniTask(cancellationToken));
 }