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() { } } }