Пример #1
0
        private CriAssetInstall GetCriAssetInstall(AssetInfo assetInfo, IProgress <float> progress)
        {
            var install = installQueueing.GetValueOrDefault(assetInfo.ResourcePath);

            if (install != null)
            {
                return(install);
            }

            install = new CriAssetInstall(assetInfo, progress);

            installQueueing[assetInfo.ResourcePath] = install;

            return(install);
        }
Пример #2
0
        private void RemoveInternalQueue(CriAssetInstall install)
        {
            if (install == null)
            {
                return;
            }

            if (install.AssetInfo == null)
            {
                return;
            }

            var resourcePath = install.AssetInfo.ResourcePath;

            var item = installQueueing.GetValueOrDefault(resourcePath);

            if (item != null)
            {
                item.Installer.Stop();
                item.Installer.Dispose();

                installQueueing.Remove(resourcePath);
            }
        }
Пример #3
0
        /// <summary>
        /// 指定されたアセットを更新.
        /// </summary>
        public IObservable <Unit> UpdateCriAsset(AssetInfo assetInfo, IProgress <float> progress = null)
        {
            if (simulateMode)
            {
                return(Observable.ReturnUnit());
            }

            if (localMode)
            {
                return(Observable.ReturnUnit());
            }

            var resourcePath = assetInfo.ResourcePath;
            var extension    = Path.GetExtension(assetInfo.ResourcePath);

            if (extension == CriAssetDefinition.AwbExtension)
            {
                return(Observable.ReturnUnit());
            }

            var installList = new List <CriAssetInstall>();

            CriAssetInstall install = null;

            if (extension == CriAssetDefinition.AcbExtension)
            {
                // Awbの拡張子でマニフェストを検索して存在したら一緒にダウンロード.
                var awbAssetPath = Path.ChangeExtension(resourcePath, CriAssetDefinition.AwbExtension);

                var awbAssetInfo = manifest.GetAssetInfo(awbAssetPath);

                //------- Acb -------

                //インストールの進行度はAwbがない場合に渡す.
                install = GetCriAssetInstall(assetInfo, awbAssetInfo == null ? progress : null);

                installList.Add(install);

                //------- Awb -------

                if (awbAssetInfo != null)
                {
                    install = GetCriAssetInstall(awbAssetInfo, progress);

                    installList.Add(install);
                }
            }
            else if (extension == CriAssetDefinition.UsmExtension)
            {
                //------- Usm -------

                install = GetCriAssetInstall(assetInfo, progress);

                installList.Add(install);
            }

            if (installList.IsEmpty())
            {
                Debug.LogErrorFormat("UpdateCriAsset Error.\n{0}", assetInfo.ResourcePath);
                return(Observable.ReturnUnit());
            }

            return(installList
                   .Select(x => x.Task)
                   .WhenAll()
                   .Timeout(TimeoutLimit)
                   .OnErrorRetry((TimeoutException ex) => OnTimeout(assetInfo, ex), RetryCount, RetryDelaySeconds)
                   .DoOnError(ex => OnError(ex))
                   .Finally(() => installList.ForEach(item => RemoveInternalQueue(item)))
                   .AsUnitObservable());
        }