| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- using System;
- using UnityEngine;
- using UnityEngine.Networking;
- namespace YooAsset
- {
- internal abstract class DownloaderBase
- {
- public enum EStatus
- {
- None = 0,
- Succeed,
- Failed
- }
- protected readonly BundleInfo _bundleInfo;
- protected readonly System.Type _requesterType;
- protected readonly int _timeout;
- protected int _failedTryAgain;
- protected IWebRequester _requester;
- protected EStatus _status = EStatus.None;
- protected string _lastestNetError = string.Empty;
- protected long _lastestHttpCode = 0;
- // 请求次数
- protected int _requestCount = 0;
- protected string _requestURL;
- // 超时相关
- protected bool _isAbort = false;
- protected ulong _latestDownloadBytes;
- protected float _latestDownloadRealtime;
- protected float _tryAgainTimer;
- /// <summary>
- /// 是否等待异步结束
- /// 警告:只能用于解压APP内部资源
- /// </summary>
- public bool WaitForAsyncComplete = false;
- /// <summary>
- /// 下载进度(0f~1f)
- /// </summary>
- public float DownloadProgress { protected set; get; }
- /// <summary>
- /// 已经下载的总字节数
- /// </summary>
- public ulong DownloadedBytes { protected set; get; }
- /// <summary>
- /// 引用计数
- /// </summary>
- public int RefCount { private set; get; }
- public DownloaderBase(BundleInfo bundleInfo, System.Type requesterType, int failedTryAgain, int timeout)
- {
- _bundleInfo = bundleInfo;
- _requesterType = requesterType;
- _failedTryAgain = failedTryAgain;
- _timeout = timeout;
- }
- public abstract void SendRequest(params object[] args);
- public abstract void Update();
- public abstract void Abort();
- public abstract AssetBundle GetAssetBundle();
- /// <summary>
- /// 引用(引用计数递加)
- /// </summary>
- public void Reference()
- {
- RefCount++;
- }
- /// <summary>
- /// 释放(引用计数递减)
- /// </summary>
- public void Release()
- {
- RefCount--;
- }
- /// <summary>
- /// 检测下载器是否已经完成(无论成功或失败)
- /// </summary>
- public bool IsDone()
- {
- return _status == EStatus.Succeed || _status == EStatus.Failed;
- }
- /// <summary>
- /// 下载过程是否发生错误
- /// </summary>
- public bool HasError()
- {
- return _status == EStatus.Failed;
- }
- /// <summary>
- /// 按照错误级别打印错误
- /// </summary>
- public void ReportError()
- {
- YooLogger.Error(GetLastError());
- }
- /// <summary>
- /// 按照警告级别打印错误
- /// </summary>
- public void ReportWarning()
- {
- YooLogger.Warning(GetLastError());
- }
- /// <summary>
- /// 获取最近发生的错误信息
- /// </summary>
- public string GetLastError()
- {
- return $"Failed to download : {_requestURL} Error : {_lastestNetError} Code : {_lastestHttpCode}";
- }
- /// <summary>
- /// 获取下载文件的大小
- /// </summary>
- /// <returns></returns>
- public long GetDownloadFileSize()
- {
- return _bundleInfo.Bundle.FileSize;
- }
- /// <summary>
- /// 获取下载的资源包名称
- /// </summary>
- public string GetDownloadBundleName()
- {
- return _bundleInfo.Bundle.BundleName;
- }
- /// <summary>
- /// 获取网络请求地址
- /// </summary>
- protected string GetRequestURL()
- {
- // 轮流返回请求地址
- _requestCount++;
- if (_requestCount % 2 == 0)
- return _bundleInfo.RemoteFallbackURL;
- else
- return _bundleInfo.RemoteMainURL;
- }
- /// <summary>
- /// 超时判定方法
- /// </summary>
- protected void CheckTimeout()
- {
- // 注意:在连续时间段内无新增下载数据及判定为超时
- if (_isAbort == false)
- {
- if (_latestDownloadBytes != DownloadedBytes)
- {
- _latestDownloadBytes = DownloadedBytes;
- _latestDownloadRealtime = Time.realtimeSinceStartup;
- }
- float offset = Time.realtimeSinceStartup - _latestDownloadRealtime;
- if (offset > _timeout)
- {
- YooLogger.Warning($"Web file request timeout : {_requestURL}");
- if (_requester != null)
- _requester.Abort();
- _isAbort = true;
- }
- }
- }
- }
- }
|