182 lines
5.0 KiB
C#
182 lines
5.0 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |