107 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.IO;
 | ||
| using UnityEngine.Networking;
 | ||
| 
 | ||
| namespace YooAsset
 | ||
| {
 | ||
|     internal class FileGeneralRequest : IWebRequester
 | ||
|     {
 | ||
|         private UnityWebRequest _webRequest;
 | ||
| 
 | ||
|         public ERequestStatus Status { private set; get; } = ERequestStatus.None;
 | ||
|         public float DownloadProgress { private set; get; }
 | ||
|         public ulong DownloadedBytes { private set; get; }
 | ||
|         public string RequestNetError { private set; get; }
 | ||
|         public long RequestHttpCode { private set; get; }
 | ||
| 
 | ||
|         public FileGeneralRequest() { }
 | ||
|         public void Create(string requestURL, BundleInfo bundleInfo, params object[] args)
 | ||
|         {
 | ||
|             if (Status != ERequestStatus.None)
 | ||
|                 throw new System.Exception("Should never get here !");
 | ||
| 
 | ||
|             string tempFilePath = bundleInfo.TempDataFilePath;
 | ||
| 
 | ||
|             // 删除临时文件
 | ||
|             if (File.Exists(tempFilePath))
 | ||
|                 File.Delete(tempFilePath);
 | ||
| 
 | ||
|             // 创建下载器
 | ||
|             _webRequest = DownloadHelper.NewRequest(requestURL);
 | ||
|             DownloadHandlerFile handler = new DownloadHandlerFile(tempFilePath);
 | ||
|             handler.removeFileOnAbort = true;
 | ||
|             _webRequest.downloadHandler = handler;
 | ||
|             _webRequest.disposeDownloadHandlerOnDispose = true;
 | ||
|             _webRequest.SendWebRequest();
 | ||
|             Status = ERequestStatus.InProgress;
 | ||
|         }
 | ||
|         public void Update()
 | ||
|         {
 | ||
|             if (Status == ERequestStatus.None)
 | ||
|                 return;
 | ||
|             if (IsDone())
 | ||
|                 return;
 | ||
| 
 | ||
|             DownloadProgress = _webRequest.downloadProgress;
 | ||
|             DownloadedBytes = _webRequest.downloadedBytes;
 | ||
|             if (_webRequest.isDone == false)
 | ||
|                 return;
 | ||
| 
 | ||
|             // 检查网络错误
 | ||
| #if UNITY_2020_3_OR_NEWER
 | ||
|             RequestHttpCode = _webRequest.responseCode;
 | ||
|             if (_webRequest.result != UnityWebRequest.Result.Success)
 | ||
|             {
 | ||
|                 RequestNetError = _webRequest.error;
 | ||
|                 Status = ERequestStatus.Error;
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 Status = ERequestStatus.Success;
 | ||
|             }
 | ||
| #else
 | ||
|             RequestHttpCode = _webRequest.responseCode;
 | ||
|             if (_webRequest.isNetworkError || _webRequest.isHttpError)
 | ||
|             {
 | ||
|                 RequestNetError = _webRequest.error;
 | ||
|                 Status = ERequestStatus.Error;
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 Status = ERequestStatus.Success;
 | ||
|             }
 | ||
| #endif
 | ||
| 
 | ||
|             // 最终释放下载器
 | ||
|             DisposeWebRequest();
 | ||
|         }
 | ||
|         public void Abort()
 | ||
|         {
 | ||
|             DisposeWebRequest();
 | ||
|             if (IsDone() == false)
 | ||
|             {
 | ||
|                 RequestNetError = "user abort";
 | ||
|                 RequestHttpCode = 0;
 | ||
|                 Status = ERequestStatus.Error;
 | ||
|             }
 | ||
|         }
 | ||
|         public bool IsDone()
 | ||
|         {
 | ||
|             if (Status == ERequestStatus.Success || Status == ERequestStatus.Error)
 | ||
|                 return true;
 | ||
|             else
 | ||
|                 return false;
 | ||
|         }
 | ||
|         public object GetRequestObject()
 | ||
|         {
 | ||
|             throw new System.NotImplementedException();
 | ||
|         }
 | ||
|         private void DisposeWebRequest()
 | ||
|         {
 | ||
|             if (_webRequest != null)
 | ||
|             {
 | ||
|                 _webRequest.Dispose(); //注意:引擎底层会自动调用Abort方法
 | ||
|                 _webRequest = null;
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| } |