93 lines
3.2 KiB
C#
93 lines
3.2 KiB
C#
using UnityEngine.Events;
|
||
|
||
namespace AssetManagement
|
||
{
|
||
// 2020.01.04 - Blastom:因为当前版本UnityWebRequest不支持下载https
|
||
// 现在下载部分无法重用AsyncLoadHub
|
||
// 快速解决方案是复制AsyncLoadHub 修改为支持BestHttp的流程
|
||
// BestHttp当前没有找到 支持直接下载到文件流的方法,暂时只能下载到内存,然后转存到硬盘
|
||
public class BundleDownloader
|
||
{
|
||
private AssetUpdateDownloader _downloader;
|
||
private AssetPathHub pathHub;
|
||
public string name { get; private set; }
|
||
public int priority { get; set; }
|
||
public string error { get; private set; }
|
||
|
||
public AsyncLoadUnitState state { get; private set; }
|
||
public AssetUpdateDownloaderTick.DownloadTimer downloadTimer { get; private set; }
|
||
|
||
// 失败重试次数
|
||
public int failCount { get; private set; }
|
||
|
||
public event UnityAction<BundleDownloader> onComplete;
|
||
|
||
// 等待时间结束
|
||
public event UnityAction<BundleDownloader> onWaitUp;
|
||
|
||
public void SetRetry(float time)
|
||
{
|
||
failCount++;
|
||
state = AsyncLoadUnitState.Idle;
|
||
downloadTimer = AssetUpdateDownloaderTick.instance.AddTimer(time, OnWaitFinish);
|
||
}
|
||
|
||
public void Init(AssetPathHub pathHub, string assetName, int priority)
|
||
{
|
||
name = assetName;
|
||
this.priority = priority;
|
||
this.pathHub = pathHub;
|
||
}
|
||
|
||
public void Load()
|
||
{
|
||
if (state != AsyncLoadUnitState.Loading)
|
||
{
|
||
error = string.Empty;
|
||
var uriPath = pathHub.GetDownloadPath(name) + AssetConst.bundleVariant;
|
||
_downloader =
|
||
new AssetUpdateDownloader(uriPath, pathHub.GetPersistPath(name + AssetConst.bundleVariant))
|
||
{onComplete = OnComplete};
|
||
_downloader.Start(30f);
|
||
}
|
||
}
|
||
|
||
// 取消下载,仅仅在关闭App时调用
|
||
public void Dispose()
|
||
{
|
||
if (_downloader != null)
|
||
{
|
||
_downloader.onComplete = null;
|
||
_downloader.Dispose();
|
||
}
|
||
|
||
_downloader = null;
|
||
}
|
||
|
||
public float GetProgress()
|
||
{
|
||
return _downloader == null ? 0f : _downloader.progress;
|
||
}
|
||
|
||
private void OnWaitFinish()
|
||
{
|
||
AssetUpdateDownloaderTick.instance.RemoveTimer(OnWaitFinish);
|
||
downloadTimer = null;
|
||
if (onWaitUp != null)
|
||
onWaitUp(this);
|
||
}
|
||
|
||
private void OnComplete(AssetUpdateDownloader downloader)
|
||
{
|
||
if (downloader.error == AssetUpdateManager.AssetUpdateError.FileCreateError)
|
||
error = string.Format("File Create Error: failed to create file for {0}!", name);
|
||
else if (downloader.error != AssetUpdateManager.AssetUpdateError.Success)
|
||
error = string.Format("Download Error: failed to download file for {0}!", name);
|
||
else
|
||
error = string.Empty;
|
||
state = AsyncLoadUnitState.Done;
|
||
if (onComplete != null)
|
||
onComplete(this);
|
||
}
|
||
}
|
||
} |