using System;
using System.Collections.Generic;
namespace NBC.Asset
{
///
/// 检查更新内容任务
///
public class CheckUpdateTask : NTask
{
public readonly UpdateContext Context = new UpdateContext();
enum Step
{
///
/// 获取远程版本清单
///
GetVersionData,
///
/// 检测版本清单
///
CheckVersionData,
///
/// 获取包清单
///
GetPackageData,
///
/// 检查包清单
///
CheckPackageData,
Success,
}
private Step _step = Step.GetVersionData;
private DownloadFileTask _getVersionFileTask;
private DownloadFileTask _getPackageTask;
protected override NTaskStatus OnProcess()
{
if (Const.Simulate) return NTaskStatus.Success;
if (_step == Step.GetVersionData)
{
if (_getVersionFileTask == null)
{
_getVersionFileTask = new DownloadFileTask(
Const.GetRemotePath($"{Const.VersionFileName}?t={Util.GetTimestamp()}"),
Const.GetCacheTempPath(Const.VersionFileName));
_getVersionFileTask.ReDownload = false;
_getVersionFileTask.Run();
}
if (!_getVersionFileTask.IsDone) return NTaskStatus.Running;
_step = Step.CheckVersionData;
}
if (_step == Step.CheckVersionData)
{
CheckVersionData();
}
if (_step == Step.GetPackageData)
{
if (Context.NewVersionData == null)
{
_step = Step.Success;
return NTaskStatus.Running;
}
if (_getPackageTask == null)
{
var newVersionData = Context.NewVersionData;
var fileName = newVersionData.NameHash;
_getPackageTask = new DownloadFileTask(Const.GetRemotePath(fileName),
Const.GetCacheTempPath(fileName), newVersionData.Hash);
_getPackageTask.Run(TaskRunner.Def);
}
if (!_getPackageTask.IsDone) return NTaskStatus.Running;
_step = Step.CheckPackageData;
}
if (_step == Step.CheckPackageData)
{
//检查需要下载的bundle信息
CheckPackageData();
}
return NTaskStatus.Success;
}
private void CheckVersionData()
{
var newVersionData = Util.ReadJson(Const.GetCacheTempPath(Const.VersionFileName));
var nowVersionData = Addressable.GetVersionData();
if (newVersionData != null)
{
if (newVersionData.Hash == nowVersionData.Hash && newVersionData.Size == nowVersionData.Size)
{
//没有变化,不需要检查
_step = Step.Success;
return;
}
Context.NewVersionData = newVersionData;
}
_step = Step.GetPackageData;
}
///
/// 检查资源包需要更新的bundle
///
private void CheckPackageData()
{
var fileName = Context.NewVersionData.NameHash;
var versionPackageData = Util.ReadJson(Const.GetCacheTempPath(fileName));
if (versionPackageData != null)
{
foreach (var package in versionPackageData.Packages)
{
var can = package.Def == 1 || Assets.IsNeedfulPackage(package.Name);
//不需要检测的包直接跳过
if (!can) return;
var oldPackageData = Addressable.GetPackageData(package.Name);
var different = CompareBundles(package.Bundles, oldPackageData.Bundles);
if (different.Count > 0)
{
foreach (var data in different)
{
Context.NeedUpdateBundleList.Add(data);
}
}
}
}
}
private List CompareBundles(List newBundles, List oldBundles)
{
List list = new List();
foreach (var bundle in newBundles)
{
var o = oldBundles.Find(b => b.Name == bundle.Name);
if (o == null || o.Hash != bundle.Hash || o.Size != bundle.Size)
{
list.Add(bundle);
}
}
return list;
}
}
}