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; } } }