| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- namespace YooAsset
- {
- public sealed class PreDownloadContentOperation : AsyncOperationBase
- {
- private enum ESteps
- {
- None,
- CheckParams,
- CheckActiveManifest,
- LoadPackageManifest,
- Done,
- }
- private readonly PlayModeImpl _impl;
- private readonly string _packageVersion;
- private readonly int _timeout;
- private FSLoadPackageManifestOperation _loadPackageManifestOp;
- private PackageManifest _manifest;
- private ESteps _steps = ESteps.None;
- internal PreDownloadContentOperation(PlayModeImpl impl, string packageVersion, int timeout)
- {
- _impl = impl;
- _packageVersion = packageVersion;
- _timeout = timeout;
- }
- internal override void InternalStart()
- {
- _steps = ESteps.CheckParams;
- }
- internal override void InternalUpdate()
- {
- if (_steps == ESteps.None || _steps == ESteps.Done)
- return;
- if (_steps == ESteps.CheckParams)
- {
- if (string.IsNullOrEmpty(_packageVersion))
- {
- _steps = ESteps.Done;
- Status = EOperationStatus.Failed;
- Error = "Package version is null or empty.";
- return;
- }
- _steps = ESteps.CheckActiveManifest;
- }
- if (_steps == ESteps.CheckActiveManifest)
- {
- // 检测当前激活的清单对象
- if (_impl.ActiveManifest != null)
- {
- if (_impl.ActiveManifest.PackageVersion == _packageVersion)
- {
- _manifest = _impl.ActiveManifest;
- _steps = ESteps.Done;
- Status = EOperationStatus.Succeed;
- return;
- }
- }
- _steps = ESteps.LoadPackageManifest;
- }
- if (_steps == ESteps.LoadPackageManifest)
- {
- if (_loadPackageManifestOp == null)
- {
- var mainFileSystem = _impl.GetMainFileSystem();
- _loadPackageManifestOp = mainFileSystem.LoadPackageManifestAsync(_packageVersion, _timeout);
- _loadPackageManifestOp.StartOperation();
- AddChildOperation(_loadPackageManifestOp);
- }
- _loadPackageManifestOp.UpdateOperation();
- if (_loadPackageManifestOp.IsDone == false)
- return;
- if (_loadPackageManifestOp.Status == EOperationStatus.Succeed)
- {
- _manifest = _loadPackageManifestOp.Manifest;
- _steps = ESteps.Done;
- Status = EOperationStatus.Succeed;
- }
- else
- {
- _steps = ESteps.Done;
- Status = EOperationStatus.Failed;
- Error = _loadPackageManifestOp.Error;
- }
- }
- }
- /// <summary>
- /// 创建资源下载器,用于下载当前资源版本所有的资源包文件
- /// </summary>
- /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
- /// <param name="failedTryAgain">下载失败的重试次数</param>
- /// <param name="timeout">超时时间</param>
- public ResourceDownloaderOperation CreateResourceDownloader(int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
- {
- if (Status != EOperationStatus.Succeed)
- {
- YooLogger.Warning($"{nameof(PreDownloadContentOperation)} status is not succeed !");
- return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
- }
- List<BundleInfo> downloadList = _impl.GetDownloadListByAll(_manifest);
- var operation = new ResourceDownloaderOperation(_impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
- return operation;
- }
- /// <summary>
- /// 创建资源下载器,用于下载指定的资源标签关联的资源包文件
- /// </summary>
- /// <param name="tag">资源标签</param>
- /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
- /// <param name="failedTryAgain">下载失败的重试次数</param>
- /// <param name="timeout">超时时间</param>
- public ResourceDownloaderOperation CreateResourceDownloader(string tag, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
- {
- if (Status != EOperationStatus.Succeed)
- {
- YooLogger.Warning($"{nameof(PreDownloadContentOperation)} status is not succeed !");
- return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
- }
- List<BundleInfo> downloadList = _impl.GetDownloadListByTags(_manifest, new string[] { tag });
- var operation = new ResourceDownloaderOperation(_impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
- return operation;
- }
- /// <summary>
- /// 创建资源下载器,用于下载指定的资源标签列表关联的资源包文件
- /// </summary>
- /// <param name="tags">资源标签列表</param>
- /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
- /// <param name="failedTryAgain">下载失败的重试次数</param>
- /// <param name="timeout">超时时间</param>
- public ResourceDownloaderOperation CreateResourceDownloader(string[] tags, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
- {
- if (Status != EOperationStatus.Succeed)
- {
- YooLogger.Warning($"{nameof(PreDownloadContentOperation)} status is not succeed !");
- return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
- }
- List<BundleInfo> downloadList = _impl.GetDownloadListByTags(_manifest, tags);
- var operation = new ResourceDownloaderOperation(_impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
- return operation;
- }
- /// <summary>
- /// 创建资源下载器,用于下载指定的资源依赖的资源包文件
- /// </summary>
- /// <param name="location">资源定位地址</param>
- /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
- /// <param name="failedTryAgain">下载失败的重试次数</param>
- /// <param name="timeout">超时时间</param>
- public ResourceDownloaderOperation CreateBundleDownloader(string location, bool recursiveDownload, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
- {
- if (Status != EOperationStatus.Succeed)
- {
- YooLogger.Warning($"{nameof(PreDownloadContentOperation)} status is not succeed !");
- return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
- }
- List<AssetInfo> assetInfos = new List<AssetInfo>();
- var assetInfo = _manifest.ConvertLocationToAssetInfo(location, null);
- assetInfos.Add(assetInfo);
- List<BundleInfo> downloadList = _impl.GetDownloadListByPaths(_manifest, assetInfos.ToArray(), recursiveDownload);
- var operation = new ResourceDownloaderOperation(_impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
- return operation;
- }
- /// <summary>
- /// 创建资源下载器,用于下载指定的资源列表依赖的资源包文件
- /// </summary>
- /// <param name="locations">资源定位地址列表</param>
- /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
- /// <param name="failedTryAgain">下载失败的重试次数</param>
- /// <param name="timeout">超时时间</param>
- public ResourceDownloaderOperation CreateBundleDownloader(string[] locations, bool recursiveDownload, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
- {
- if (Status != EOperationStatus.Succeed)
- {
- YooLogger.Warning($"{nameof(PreDownloadContentOperation)} status is not succeed !");
- return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
- }
- List<AssetInfo> assetInfos = new List<AssetInfo>(locations.Length);
- foreach (var location in locations)
- {
- var assetInfo = _manifest.ConvertLocationToAssetInfo(location, null);
- assetInfos.Add(assetInfo);
- }
- List<BundleInfo> downloadList = _impl.GetDownloadListByPaths(_manifest, assetInfos.ToArray(), recursiveDownload);
- var operation = new ResourceDownloaderOperation(_impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
- return operation;
- }
- }
- }
|