363 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			363 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| 
 | |
| namespace YooAsset
 | |
| {
 | |
|     public abstract class PreDownloadContentOperation : AsyncOperationBase
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// 创建资源下载器,用于下载当前资源版本所有的资源包文件
 | |
|         /// </summary>
 | |
|         /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
 | |
|         /// <param name="failedTryAgain">下载失败的重试次数</param>
 | |
|         /// <param name="timeout">超时时间</param>
 | |
|         public abstract ResourceDownloaderOperation CreateResourceDownloader(int downloadingMaxNumber, int failedTryAgain, int timeout = 60);
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 创建资源下载器,用于下载指定的资源标签关联的资源包文件
 | |
|         /// </summary>
 | |
|         /// <param name="tag">资源标签</param>
 | |
|         /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
 | |
|         /// <param name="failedTryAgain">下载失败的重试次数</param>
 | |
|         /// <param name="timeout">超时时间</param>
 | |
|         public abstract ResourceDownloaderOperation CreateResourceDownloader(string tag, int downloadingMaxNumber, int failedTryAgain, int timeout = 60);
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 创建资源下载器,用于下载指定的资源标签列表关联的资源包文件
 | |
|         /// </summary>
 | |
|         /// <param name="tags">资源标签列表</param>
 | |
|         /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
 | |
|         /// <param name="failedTryAgain">下载失败的重试次数</param>
 | |
|         /// <param name="timeout">超时时间</param>
 | |
|         public abstract ResourceDownloaderOperation CreateResourceDownloader(string[] tags, int downloadingMaxNumber, int failedTryAgain, int timeout = 60);
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 创建资源下载器,用于下载指定的资源依赖的资源包文件
 | |
|         /// </summary>
 | |
|         /// <param name="location">资源定位地址</param>
 | |
|         /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
 | |
|         /// <param name="failedTryAgain">下载失败的重试次数</param>
 | |
|         /// <param name="timeout">超时时间</param>
 | |
|         public abstract ResourceDownloaderOperation CreateBundleDownloader(string location, int downloadingMaxNumber, int failedTryAgain, int timeout = 60);
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 创建资源下载器,用于下载指定的资源列表依赖的资源包文件
 | |
|         /// </summary>
 | |
|         /// <param name="locations">资源定位地址列表</param>
 | |
|         /// <param name="downloadingMaxNumber">同时下载的最大文件数</param>
 | |
|         /// <param name="failedTryAgain">下载失败的重试次数</param>
 | |
|         /// <param name="timeout">超时时间</param>
 | |
|         public abstract ResourceDownloaderOperation CreateBundleDownloader(string[] locations, int downloadingMaxNumber, int failedTryAgain, int timeout = 60);
 | |
|     }
 | |
| 
 | |
|     internal class EditorPlayModePreDownloadContentOperation : PreDownloadContentOperation
 | |
|     {
 | |
|         private readonly EditorSimulateModeImpl _impl;
 | |
| 
 | |
|         public EditorPlayModePreDownloadContentOperation(EditorSimulateModeImpl impl)
 | |
|         {
 | |
|             _impl = impl;
 | |
|         }
 | |
|         internal override void InternalOnStart()
 | |
|         {
 | |
|             Status = EOperationStatus.Succeed;
 | |
|         }
 | |
|         internal override void InternalOnUpdate()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public override ResourceDownloaderOperation CreateResourceDownloader(int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateResourceDownloader(string tag, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateResourceDownloader(string[] tags, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateBundleDownloader(string location, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateBundleDownloader(string[] locations, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|     }
 | |
|     internal class OfflinePlayModePreDownloadContentOperation : PreDownloadContentOperation
 | |
|     {
 | |
|         private readonly OfflinePlayModeImpl _impl;
 | |
| 
 | |
|         public OfflinePlayModePreDownloadContentOperation(OfflinePlayModeImpl impl)
 | |
|         {
 | |
|             _impl = impl;
 | |
|         }
 | |
|         internal override void InternalOnStart()
 | |
|         {
 | |
|             Status = EOperationStatus.Succeed;
 | |
|         }
 | |
|         internal override void InternalOnUpdate()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public override ResourceDownloaderOperation CreateResourceDownloader(int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateResourceDownloader(string tag, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateResourceDownloader(string[] tags, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateBundleDownloader(string location, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateBundleDownloader(string[] locations, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|     }
 | |
|     internal class HostPlayModePreDownloadContentOperation : PreDownloadContentOperation
 | |
|     {
 | |
|         private enum ESteps
 | |
|         {
 | |
|             None,
 | |
|             CheckActiveManifest,
 | |
|             TryLoadCacheManifest,
 | |
|             DownloadManifest,
 | |
|             LoadCacheManifest,
 | |
|             CheckDeserializeManifest,
 | |
|             Done,
 | |
|         }
 | |
| 
 | |
|         private readonly HostPlayModeImpl _impl;
 | |
|         private readonly string _packageVersion;
 | |
|         private readonly int _timeout;
 | |
|         private LoadCacheManifestOperation _tryLoadCacheManifestOp;
 | |
|         private LoadCacheManifestOperation _loadCacheManifestOp;
 | |
|         private DownloadManifestOperation _downloadManifestOp;
 | |
|         private PackageManifest _manifest;
 | |
|         private ESteps _steps = ESteps.None;
 | |
| 
 | |
| 
 | |
|         internal HostPlayModePreDownloadContentOperation(HostPlayModeImpl impl, string packageVersion, int timeout)
 | |
|         {
 | |
|             _impl = impl;
 | |
|             _packageVersion = packageVersion;
 | |
|             _timeout = timeout;
 | |
|         }
 | |
|         internal override void InternalOnStart()
 | |
|         {
 | |
|             _steps = ESteps.CheckActiveManifest;
 | |
|         }
 | |
|         internal override void InternalOnUpdate()
 | |
|         {
 | |
|             if (_steps == ESteps.None || _steps == ESteps.Done)
 | |
|                 return;
 | |
| 
 | |
|             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.TryLoadCacheManifest;
 | |
|             }
 | |
| 
 | |
|             if (_steps == ESteps.TryLoadCacheManifest)
 | |
|             {
 | |
|                 if (_tryLoadCacheManifestOp == null)
 | |
|                 {
 | |
|                     _tryLoadCacheManifestOp = new LoadCacheManifestOperation(_impl.Persistent, _packageVersion);
 | |
|                     OperationSystem.StartOperation(_impl.PackageName, _tryLoadCacheManifestOp);
 | |
|                 }
 | |
| 
 | |
|                 if (_tryLoadCacheManifestOp.IsDone == false)
 | |
|                     return;
 | |
| 
 | |
|                 if (_tryLoadCacheManifestOp.Status == EOperationStatus.Succeed)
 | |
|                 {
 | |
|                     _manifest = _tryLoadCacheManifestOp.Manifest;
 | |
|                     _steps = ESteps.Done;
 | |
|                     Status = EOperationStatus.Succeed;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     _steps = ESteps.DownloadManifest;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (_steps == ESteps.DownloadManifest)
 | |
|             {
 | |
|                 if (_downloadManifestOp == null)
 | |
|                 {
 | |
|                     _downloadManifestOp = new DownloadManifestOperation(_impl.Persistent, _impl.RemoteServices, _packageVersion, _timeout);
 | |
|                     OperationSystem.StartOperation(_impl.PackageName, _downloadManifestOp);
 | |
|                 }
 | |
| 
 | |
|                 if (_downloadManifestOp.IsDone == false)
 | |
|                     return;
 | |
| 
 | |
|                 if (_downloadManifestOp.Status == EOperationStatus.Succeed)
 | |
|                 {
 | |
|                     _steps = ESteps.LoadCacheManifest;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     _steps = ESteps.Done;
 | |
|                     Status = EOperationStatus.Failed;
 | |
|                     Error = _downloadManifestOp.Error;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (_steps == ESteps.LoadCacheManifest)
 | |
|             {
 | |
|                 if (_loadCacheManifestOp == null)
 | |
|                 {
 | |
|                     _loadCacheManifestOp = new LoadCacheManifestOperation(_impl.Persistent, _packageVersion);
 | |
|                     OperationSystem.StartOperation(_impl.PackageName, _loadCacheManifestOp);
 | |
|                 }
 | |
| 
 | |
|                 if (_loadCacheManifestOp.IsDone == false)
 | |
|                     return;
 | |
| 
 | |
|                 if (_loadCacheManifestOp.Status == EOperationStatus.Succeed)
 | |
|                 {
 | |
|                     _manifest = _loadCacheManifestOp.Manifest;
 | |
|                     _steps = ESteps.Done;
 | |
|                     Status = EOperationStatus.Succeed;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     _steps = ESteps.Done;
 | |
|                     Status = EOperationStatus.Failed;
 | |
|                     Error = _loadCacheManifestOp.Error;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override 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.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|             }
 | |
| 
 | |
|             List<BundleInfo> downloadList = _impl.GetDownloadListByAll(_manifest);
 | |
|             var operation = new ResourceDownloaderOperation(_impl.Download, _impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|             return operation;
 | |
|         }
 | |
|         public override 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.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|             }
 | |
| 
 | |
|             List<BundleInfo> downloadList = _impl.GetDownloadListByTags(_manifest, new string[] { tag });
 | |
|             var operation = new ResourceDownloaderOperation(_impl.Download, _impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|             return operation;
 | |
|         }
 | |
|         public override 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.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|             }
 | |
| 
 | |
|             List<BundleInfo> downloadList = _impl.GetDownloadListByTags(_manifest, tags);
 | |
|             var operation = new ResourceDownloaderOperation(_impl.Download, _impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|             return operation;
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateBundleDownloader(string location, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             if (Status != EOperationStatus.Succeed)
 | |
|             {
 | |
|                 YooLogger.Warning($"{nameof(PreDownloadContentOperation)} status is not succeed !");
 | |
|                 return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _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());
 | |
|             var operation = new ResourceDownloaderOperation(_impl.Download, _impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|             return operation;
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateBundleDownloader(string[] locations, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             if (Status != EOperationStatus.Succeed)
 | |
|             {
 | |
|                 YooLogger.Warning($"{nameof(PreDownloadContentOperation)} status is not succeed !");
 | |
|                 return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _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());
 | |
|             var operation = new ResourceDownloaderOperation(_impl.Download, _impl.PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|             return operation;
 | |
|         }
 | |
|     }
 | |
|     internal class WebPlayModePreDownloadContentOperation : PreDownloadContentOperation
 | |
|     {
 | |
|         private readonly WebPlayModeImpl _impl;
 | |
| 
 | |
|         public WebPlayModePreDownloadContentOperation(WebPlayModeImpl impl)
 | |
|         {
 | |
|             _impl = impl;
 | |
|         }
 | |
|         internal override void InternalOnStart()
 | |
|         {
 | |
|             Status = EOperationStatus.Succeed;
 | |
|         }
 | |
|         internal override void InternalOnUpdate()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public override ResourceDownloaderOperation CreateResourceDownloader(int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateResourceDownloader(string tag, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateResourceDownloader(string[] tags, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateBundleDownloader(string location, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|         public override ResourceDownloaderOperation CreateBundleDownloader(string[] locations, int downloadingMaxNumber, int failedTryAgain, int timeout = 60)
 | |
|         {
 | |
|             return ResourceDownloaderOperation.CreateEmptyDownloader(_impl.Download, _impl.PackageName, downloadingMaxNumber, failedTryAgain, timeout);
 | |
|         }
 | |
|     }
 | |
| } |