首次提交

This commit is contained in:
Bob.Song
2026-03-05 18:07:55 +08:00
commit e125bb869e
4534 changed files with 563920 additions and 0 deletions

View File

@@ -0,0 +1,159 @@
using System;
using System.Collections.Generic;
namespace NBC.Asset
{
/// <summary>
/// 检查更新内容任务
/// </summary>
public class CheckUpdateTask : NTask
{
public readonly UpdateContext Context = new UpdateContext();
enum Step
{
/// <summary>
/// 获取远程版本清单
/// </summary>
GetVersionData,
/// <summary>
/// 检测版本清单
/// </summary>
CheckVersionData,
/// <summary>
/// 获取包清单
/// </summary>
GetPackageData,
/// <summary>
/// 检查包清单
/// </summary>
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<VersionData>(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;
}
/// <summary>
/// 检查资源包需要更新的bundle
/// </summary>
private void CheckPackageData()
{
var fileName = Context.NewVersionData.NameHash;
var versionPackageData = Util.ReadJson<VersionPackageData>(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<BundleData> CompareBundles(List<BundleData> newBundles, List<BundleData> oldBundles)
{
List<BundleData> list = new List<BundleData>();
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;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c86b2e1c83c44b5392fc5b315955ea62
timeCreated: 1678695473

View File

@@ -0,0 +1,26 @@
using System.Collections.Generic;
using System.Linq;
namespace NBC.Asset
{
public class UpdateContext
{
/// <summary>
/// 需要更新的文件总大小
/// </summary>
public long DownloadTotalSize => NeedUpdateBundleList.Sum(data => data.Size);
/// <summary>
/// 需要更新的bundles
/// </summary>
public readonly HashSet<BundleData> NeedUpdateBundleList = new HashSet<BundleData>();
// /// <summary>
// /// 需要更新的package
// /// </summary>
// public readonly HashSet<string> NeedVersionPackages = new HashSet<string>();
public VersionData NewVersionData;
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2c885b61fa9f498996c98a6c15c988ca
timeCreated: 1678802682

View File

@@ -0,0 +1,65 @@
using System.Collections.Generic;
using System.IO;
namespace NBC.Asset
{
/// <summary>
/// 更新版本内容任务
/// </summary>
public class UpdateVersionTask : DownloadTaskBase
{
private UpdateContext _context;
private SequenceTaskCollection _sequence = new SequenceTaskCollection();
private ParallelTaskCollection _downloadParallel = new ParallelTaskCollection();
public override float Progress => _downloadParallel.Progress;
public UpdateVersionTask(UpdateContext context)
{
_context = context;
}
protected override void OnStart()
{
_sequence.FailBreak = true;
_downloadParallel.ParallelNum = 5;
_downloadParallel.FailBreak = true;
var bundles = _context.NeedUpdateBundleList;
if (bundles != null && bundles.Count > 0)
{
foreach (var bundle in bundles)
{
_downloadParallel.AddTask(new DownloadFileTask(bundle.RemoteDataFilePath,
bundle.CachedDataFilePath));
}
_sequence.AddTask(_downloadParallel);
}
_sequence.AddTask(new RunFunctionTask(TryCoverNewVersionData));
_sequence.AddTask(new RunFunctionTask(Addressable.Load));
_sequence.Run(TaskRunner.DownloadRunner);
}
protected override NTaskStatus OnProcess()
{
return _sequence.IsDone ? _sequence.Status : NTaskStatus.Running;
}
/// <summary>
/// 尝试覆盖旧的版本清单文件
/// </summary>
private void TryCoverNewVersionData()
{
if (_context.NewVersionData != null)
{
var nameHash = _context.NewVersionData.NameHash;
//覆盖旧的清单文件
File.Copy(Const.GetCacheTempPath(nameHash), Const.GetCachePath(nameHash), true);
}
//覆盖旧的version.json
File.Copy(Const.GetCacheTempPath(Const.VersionFileName), Const.GetCachePath(Const.VersionFileName), true);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 613c439d2f0342cdb2ec473d38a3c0a3
timeCreated: 1678769071