140 lines
4.1 KiB
C#
140 lines
4.1 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using UnityEngine;
|
|
|
|
namespace YooAsset
|
|
{
|
|
internal sealed class WebDownloader : DownloaderBase
|
|
{
|
|
private enum ESteps
|
|
{
|
|
None,
|
|
PrepareDownload,
|
|
CreateDownloader,
|
|
CheckDownload,
|
|
TryAgain,
|
|
Done,
|
|
}
|
|
|
|
private ESteps _steps = ESteps.None;
|
|
private bool _getAssetBundle = false;
|
|
|
|
public WebDownloader(BundleInfo bundleInfo, System.Type requesterType, int failedTryAgain, int timeout) : base(bundleInfo, requesterType, failedTryAgain, timeout)
|
|
{
|
|
}
|
|
public override void SendRequest(params object[] args)
|
|
{
|
|
if (_steps == ESteps.None)
|
|
{
|
|
if (args.Length > 0)
|
|
{
|
|
_getAssetBundle = (bool)args[0];
|
|
}
|
|
_steps = ESteps.PrepareDownload;
|
|
}
|
|
}
|
|
public override void Update()
|
|
{
|
|
if (_steps == ESteps.None)
|
|
return;
|
|
if (IsDone())
|
|
return;
|
|
|
|
// 创建下载器
|
|
if (_steps == ESteps.PrepareDownload)
|
|
{
|
|
// 获取请求地址
|
|
_requestURL = GetRequestURL();
|
|
|
|
// 重置变量
|
|
DownloadProgress = 0f;
|
|
DownloadedBytes = 0;
|
|
|
|
// 重置变量
|
|
_isAbort = false;
|
|
_latestDownloadBytes = 0;
|
|
_latestDownloadRealtime = Time.realtimeSinceStartup;
|
|
|
|
// 重置计时器
|
|
if (_tryAgainTimer > 0f)
|
|
YooLogger.Warning($"Try again download : {_requestURL}");
|
|
_tryAgainTimer = 0f;
|
|
|
|
_steps = ESteps.CreateDownloader;
|
|
}
|
|
|
|
// 创建下载器
|
|
if (_steps == ESteps.CreateDownloader)
|
|
{
|
|
_requester = (IWebRequester)Activator.CreateInstance(_requesterType);
|
|
_requester.Create(_requestURL, _bundleInfo, _getAssetBundle);
|
|
_steps = ESteps.CheckDownload;
|
|
}
|
|
|
|
// 检测下载结果
|
|
if (_steps == ESteps.CheckDownload)
|
|
{
|
|
_requester.Update();
|
|
DownloadedBytes = _requester.DownloadedBytes;
|
|
DownloadProgress = _requester.DownloadProgress;
|
|
if (_requester.IsDone() == false)
|
|
{
|
|
CheckTimeout();
|
|
return;
|
|
}
|
|
|
|
_lastestNetError = _requester.RequestNetError;
|
|
_lastestHttpCode = _requester.RequestHttpCode;
|
|
if (_requester.Status != ERequestStatus.Success)
|
|
{
|
|
_steps = ESteps.TryAgain;
|
|
}
|
|
else
|
|
{
|
|
_status = EStatus.Succeed;
|
|
_steps = ESteps.Done;
|
|
}
|
|
}
|
|
|
|
// 重新尝试下载
|
|
if (_steps == ESteps.TryAgain)
|
|
{
|
|
if (_failedTryAgain <= 0)
|
|
{
|
|
ReportError();
|
|
_status = EStatus.Failed;
|
|
_steps = ESteps.Done;
|
|
return;
|
|
}
|
|
|
|
_tryAgainTimer += Time.unscaledDeltaTime;
|
|
if (_tryAgainTimer > 1f)
|
|
{
|
|
_failedTryAgain--;
|
|
_steps = ESteps.PrepareDownload;
|
|
ReportWarning();
|
|
YooLogger.Warning($"Try again download : {_requestURL}");
|
|
}
|
|
}
|
|
}
|
|
public override void Abort()
|
|
{
|
|
if (_requester != null)
|
|
_requester.Abort();
|
|
|
|
if (IsDone() == false)
|
|
{
|
|
_status = EStatus.Failed;
|
|
_steps = ESteps.Done;
|
|
_lastestNetError = "user abort";
|
|
_lastestHttpCode = 0;
|
|
}
|
|
}
|
|
public override AssetBundle GetAssetBundle()
|
|
{
|
|
return (AssetBundle)_requester.GetRequestObject();
|
|
}
|
|
}
|
|
} |