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