using System;
namespace YooAsset
{
///
/// 模拟下载器
///
///
/// 用于编辑器模式下模拟下载进度,不进行实际网络请求。
/// 根据配置的下载速度模拟进度变化。
///
internal sealed class SimulateRequestFile : IDownloadFileRequest
{
private readonly DownloadSimulateRequestArgs _args;
private double _lastTickTime;
///
/// 文件保存路径(模拟下载不需要)
///
public string SavePath
{
get { return null; }
}
#region 接口实现
///
/// 请求地址
///
public string URL { get; }
///
/// 是否完成
///
public bool IsDone
{
get
{
PollingRequest();
return Status == EDownloadRequestStatus.Succeed
|| Status == EDownloadRequestStatus.Failed
|| Status == EDownloadRequestStatus.Aborted;
}
}
///
/// 请求状态
///
public EDownloadRequestStatus Status { get; private set; }
///
/// 当前下载进度(0f - 1f)
///
public float DownloadProgress { get; private set; }
///
/// 当前请求已接收的字节数
///
public long DownloadedBytes { get; private set; }
///
/// HTTP 返回码(模拟固定返回 200)
///
public long HttpCode { get; private set; }
///
/// 错误信息
///
public string Error { get; private set; }
#endregion
///
/// 构造模拟下载器
///
/// 模拟下载参数
public SimulateRequestFile(DownloadSimulateRequestArgs args)
{
_args = args;
URL = args.URL;
Status = EDownloadRequestStatus.None;
}
///
/// 发起请求
///
public void SendRequest()
{
if (Status == EDownloadRequestStatus.None)
{
Status = EDownloadRequestStatus.Running;
_lastTickTime = TimeUtility.RealtimeSinceStartup;
}
}
///
/// 轮询请求
///
public void PollingRequest()
{
if (Status != EDownloadRequestStatus.Running)
return;
double currentTime = TimeUtility.RealtimeSinceStartup;
double deltaTime = currentTime - _lastTickTime;
_lastTickTime = currentTime;
// 计算本帧下载的字节数
long downloadBytes = (long)(_args.DownloadSpeed * deltaTime);
DownloadedBytes += downloadBytes;
if (_args.FileSize > 0)
DownloadProgress = (float)DownloadedBytes / _args.FileSize;
// 检查是否完成
if (DownloadedBytes >= _args.FileSize)
{
HttpCode = 200;
DownloadProgress = 1f;
DownloadedBytes = _args.FileSize;
Status = EDownloadRequestStatus.Succeed;
}
}
///
/// 中止请求
///
public void AbortRequest()
{
if (Status == EDownloadRequestStatus.None || Status == EDownloadRequestStatus.Running)
{
Status = EDownloadRequestStatus.Aborted;
}
}
///
/// 释放资源
///
public void Dispose()
{
}
}
}