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;
- }
- }
- }
- }
- }
|