140 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System; | |||
|  | using System.Collections; | |||
|  | using System.Collections.Generic; | |||
|  | using System.IO; | |||
|  | using UnityEngine; | |||
|  | 
 | |||
|  | namespace YooAsset | |||
|  | { | |||
|  |     internal sealed class WebDownloader : DownloaderBase | |||
|  |     { | |||
|  |         private enum ESteps | |||
|  |         { | |||
|  |             None, | |||
|  |             PrepareDownload, | |||
|  |             CreateDownloader, | |||
|  |             CheckDownload, | |||
|  |             TryAgain, | |||
|  |             Done, | |||
|  |         } | |||
|  | 
 | |||
|  |         private ESteps _steps = ESteps.None; | |||
|  |         private bool _getAssetBundle = false; | |||
|  | 
 | |||
|  |         public WebDownloader(BundleInfo bundleInfo, System.Type requesterType, int failedTryAgain, int timeout) : base(bundleInfo, requesterType, failedTryAgain, timeout) | |||
|  |         { | |||
|  |         } | |||
|  |         public override void SendRequest(params object[] args) | |||
|  |         { | |||
|  |             if (_steps == ESteps.None) | |||
|  |             { | |||
|  |                 if (args.Length > 0) | |||
|  |                 { | |||
|  |                     _getAssetBundle = (bool)args[0]; | |||
|  |                 } | |||
|  |                 _steps = ESteps.PrepareDownload; | |||
|  |             } | |||
|  |         } | |||
|  |         public override void Update() | |||
|  |         { | |||
|  |             if (_steps == ESteps.None) | |||
|  |                 return; | |||
|  |             if (IsDone()) | |||
|  |                 return; | |||
|  | 
 | |||
|  |             // 创建下载器 | |||
|  |             if (_steps == ESteps.PrepareDownload) | |||
|  |             { | |||
|  |                 // 获取请求地址 | |||
|  |                 _requestURL = GetRequestURL(); | |||
|  | 
 | |||
|  |                 // 重置变量 | |||
|  |                 DownloadProgress = 0f; | |||
|  |                 DownloadedBytes = 0; | |||
|  | 
 | |||
|  |                 // 重置变量 | |||
|  |                 _isAbort = false; | |||
|  |                 _latestDownloadBytes = 0; | |||
|  |                 _latestDownloadRealtime = Time.realtimeSinceStartup; | |||
|  | 
 | |||
|  |                 // 重置计时器 | |||
|  |                 if (_tryAgainTimer > 0f) | |||
|  |                     YooLogger.Warning($"Try again download : {_requestURL}"); | |||
|  |                 _tryAgainTimer = 0f; | |||
|  | 
 | |||
|  |                 _steps = ESteps.CreateDownloader; | |||
|  |             } | |||
|  | 
 | |||
|  |             // 创建下载器 | |||
|  |             if (_steps == ESteps.CreateDownloader) | |||
|  |             { | |||
|  |                 _requester = (IWebRequester)Activator.CreateInstance(_requesterType); | |||
|  |                 _requester.Create(_requestURL, _bundleInfo, _getAssetBundle); | |||
|  |                 _steps = ESteps.CheckDownload; | |||
|  |             } | |||
|  | 
 | |||
|  |             // 检测下载结果 | |||
|  |             if (_steps == ESteps.CheckDownload) | |||
|  |             { | |||
|  |                 _requester.Update(); | |||
|  |                 DownloadedBytes = _requester.DownloadedBytes; | |||
|  |                 DownloadProgress = _requester.DownloadProgress; | |||
|  |                 if (_requester.IsDone() == false) | |||
|  |                 { | |||
|  |                     CheckTimeout(); | |||
|  |                     return; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 _lastestNetError = _requester.RequestNetError; | |||
|  |                 _lastestHttpCode = _requester.RequestHttpCode; | |||
|  |                 if (_requester.Status != ERequestStatus.Success) | |||
|  |                 { | |||
|  |                     _steps = ESteps.TryAgain; | |||
|  |                 } | |||
|  |                 else | |||
|  |                 { | |||
|  |                     _status = EStatus.Succeed; | |||
|  |                     _steps = ESteps.Done; | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             // 重新尝试下载 | |||
|  |             if (_steps == ESteps.TryAgain) | |||
|  |             { | |||
|  |                 if (_failedTryAgain <= 0) | |||
|  |                 { | |||
|  |                     ReportError(); | |||
|  |                     _status = EStatus.Failed; | |||
|  |                     _steps = ESteps.Done; | |||
|  |                     return; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 _tryAgainTimer += Time.unscaledDeltaTime; | |||
|  |                 if (_tryAgainTimer > 1f) | |||
|  |                 { | |||
|  |                     _failedTryAgain--; | |||
|  |                     _steps = ESteps.PrepareDownload; | |||
|  |                     ReportWarning(); | |||
|  |                     YooLogger.Warning($"Try again download : {_requestURL}"); | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  |         public override void Abort() | |||
|  |         { | |||
|  |             if (_requester != null) | |||
|  |                 _requester.Abort(); | |||
|  | 
 | |||
|  |             if (IsDone() == false) | |||
|  |             { | |||
|  |                 _status = EStatus.Failed; | |||
|  |                 _steps = ESteps.Done; | |||
|  |                 _lastestNetError = "user abort"; | |||
|  |                 _lastestHttpCode = 0; | |||
|  |             } | |||
|  |         } | |||
|  |         public override AssetBundle GetAssetBundle() | |||
|  |         { | |||
|  |             return (AssetBundle)_requester.GetRequestObject(); | |||
|  |         } | |||
|  |     } | |||
|  | } |