| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | using System;using System.Collections;using System.Collections.Generic;using UnityEngine.Networking;using UnityEngine;namespace YooAsset{	/// <summary>	/// 下载器	/// 说明:UnityWebRequest(UWR) supports reading streaming assets since 2017.1	/// </summary>	internal class UnityWebFileRequester	{		private UnityWebRequest _webRequest;		private UnityWebRequestAsyncOperation _operationHandle;		// 超时相关		private float _timeout;		private bool _isAbort = false;		private ulong _latestDownloadBytes;		private float _latestDownloadRealtime;		/// <summary>		/// 请求URL地址		/// </summary>		public string URL { private set; get; }		/// <summary>		/// 发送GET请求		/// </summary>		public void SendRequest(string url, string savePath, float timeout = 60)		{			if (_webRequest == null)			{				URL = url;				_timeout = timeout;				_latestDownloadBytes = 0;				_latestDownloadRealtime = Time.realtimeSinceStartup;				_webRequest = DownloadSystem.NewRequest(URL);				DownloadHandlerFile handler = new DownloadHandlerFile(savePath);				handler.removeFileOnAbort = true;				_webRequest.downloadHandler = handler;				_webRequest.disposeDownloadHandlerOnDispose = true;				_operationHandle = _webRequest.SendWebRequest();			}		}		/// <summary>		/// 释放下载器		/// </summary>		public void Dispose()		{			if (_webRequest != null)			{				_webRequest.Dispose();				_webRequest = null;				_operationHandle = null;			}		}		/// <summary>		/// 是否完毕(无论成功失败)		/// </summary>		public bool IsDone()		{			if (_operationHandle == null)				return false;			return _operationHandle.isDone;		}		/// <summary>		/// 下载进度		/// </summary>		public float Progress()		{			if (_operationHandle == null)				return 0;			return _operationHandle.progress;		}		/// <summary>		/// 下载是否发生错误		/// </summary>		public bool HasError()		{#if UNITY_2020_3_OR_NEWER			return _webRequest.result != UnityWebRequest.Result.Success;#else			if (_webRequest.isNetworkError || _webRequest.isHttpError)				return true;			else				return false;#endif		}		/// <summary>		/// 获取错误信息		/// </summary>		public string GetError()		{			if (_webRequest != null)			{				return $"URL : {URL} Error : {_webRequest.error}";			}			return string.Empty;		}		/// <summary>		/// 检测超时		/// </summary>		public void CheckTimeout()		{			// 注意:在连续时间段内无新增下载数据及判定为超时			if (_isAbort == false)			{				if (_latestDownloadBytes != _webRequest.downloadedBytes)				{					_latestDownloadBytes = _webRequest.downloadedBytes;					_latestDownloadRealtime = Time.realtimeSinceStartup;				}				float offset = Time.realtimeSinceStartup - _latestDownloadRealtime;				if (offset > _timeout)				{					_webRequest.Abort();					_isAbort = true;				}			}		}	}}
 |