JisolGame/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedurePackageDownloader.cs

243 lines
8.7 KiB
C#
Raw Normal View History

2024-10-16 02:48:23 +08:00
using System;
using Cysharp.Threading.Tasks;
2024-10-15 18:26:52 +08:00
using SHFrame;
using SHFrame.FSM;
2024-10-16 02:48:23 +08:00
using UnityEngine;
2024-10-15 18:26:52 +08:00
using YooAsset;
2024-10-16 02:48:23 +08:00
using EventArgs = SHFrame.EventArgs;
2024-10-15 18:26:52 +08:00
namespace HotMain.SHGame.Procedure
{
public class ProcedurePackageDownloader : ProcedureBase
{
private int launcherPatchCount = 0;
private int totalDownloadCount = 0;
private long totalDownloadBytes = 0;
2024-10-16 02:48:23 +08:00
private IFsm<IProcedureManager> Procedure;
private bool isStartDownloader = false;
2024-10-15 18:26:52 +08:00
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
{
2024-10-16 02:48:23 +08:00
Procedure = procedureOwner;
2024-10-15 18:26:52 +08:00
base.OnEnter(procedureOwner);
2024-10-16 02:48:23 +08:00
2024-10-15 18:26:52 +08:00
launcherPatchCount = 0;
totalDownloadCount = 0;
totalDownloadBytes = 0;
2024-10-16 02:48:23 +08:00
//监听开始下载
EventUtil.AddListener(HotMainEvent.StartDownloader,OnStartDownloader);
//打开Launcher
RunLauncher().Forget();
}
protected override void OnLeave(IFsm<IProcedureManager> procedureOwner, bool isShutdown)
{
base.OnLeave(procedureOwner, isShutdown);
EventUtil.RemoveListener(HotMainEvent.StartDownloader,OnStartDownloader);
}
public async UniTask RunLauncher()
{
//打开LauncherMain
var package = YooAssets.GetPackage(ProcedureInitializePackage.DefaultPackageName);
var handle = package.LoadAssetAsync<GameObject>("HotLauncher");
await handle.ToUniTask();
var hotLauncher = handle.InstantiateSync();
hotLauncher.name = $"HotLauncher_{package.GetPackageVersion()}";
2024-10-15 18:26:52 +08:00
}
2024-10-16 02:48:23 +08:00
private void OnStartDownloader(EventArgs eventargs)
{
Download(Procedure);
}
2024-10-15 18:26:52 +08:00
private async void Download(IFsm<IProcedureManager> procedureOwner)
{
2024-10-16 02:48:23 +08:00
if (isStartDownloader) return;
isStartDownloader = true;
//检查launcher标签的资源
launcherPatchCount += TryGetTagPatchCount(ProcedureInitializePackage.RawFilePackageName, "Launcher");
launcherPatchCount += TryGetTagPatchCount(ProcedureInitializePackage.DefaultPackageName, "Launcher");
if (launcherPatchCount > 0)
{
Log.Warning("launcher资源需要更新下载完成后需要重启游戏");
totalDownloadCount += launcherPatchCount;
}
2024-10-15 18:26:52 +08:00
// 完全通过远端获取的资源,每次启动游戏都检查是否需要更新
//TODO 把这个玩意拆分成 1、获取下载文件大小2、提示总的下载大小提示确认3、开始下载
ResourcePackage rawFilePackage = YooAssets.GetPackage(ProcedureInitializePackage.RawFilePackageName);
totalDownloadBytes += TryDownloadPatch(rawFilePackage);
ResourcePackage defaultPackage = YooAssets.GetPackage(ProcedureInitializePackage.DefaultPackageName);
totalDownloadBytes += TryDownloadPatch(defaultPackage);
if (totalDownloadCount > 0 || totalDownloadBytes > 0)
{
Log.Warning("开始下载资源");
//进行下载
var result = await GetDownload(rawFilePackage);
if (!result) return;
//进行下载
result = await GetDownload(defaultPackage);
if (!result) return;
//判断launcher资源是否有更新有就弹窗重启游戏
if (launcherPatchCount > 0)
{
Log.Warning("launcher资源有更新需要重启游戏");
return;
}
// 资源下载完毕
Log.Warning("资源下载完毕");
}
else
{
Log.Warning("没有资源需要更新");
}
//切换到加载热更包入口
ChangeState<ProcedureLoadHot>(procedureOwner);
2024-10-16 02:48:23 +08:00
2024-10-15 18:26:52 +08:00
}
private int TryGetTagPatchCount(string packageName, string tag)
{
ResourcePackage package = YooAssets.GetPackage(packageName);
//4.下载补丁包信息,反馈到弹窗
var downloader = package.CreateResourceDownloader(tag, 10, 3, 60);
//没有需要下载的资源
if (downloader.TotalDownloadCount == 0)
{
Log.Warning($"{package.PackageName} tag {tag} 没有资源更新");
return 0;
}
//需要下载的文件总数和总大小
Log.Warning($"{package.PackageName} tag {tag} 文件总数:{downloader.TotalDownloadCount}:::总大小:{downloader.TotalDownloadBytes}");
return totalDownloadCount;
}
/// <summary>
///
/// </summary>
/// <param name="package"></param>
private long TryDownloadPatch(ResourcePackage package)
{
//4.下载补丁包信息,反馈到弹窗
var downloader = package.CreateResourceDownloader(10, 3, 60);
//没有需要下载的资源
if (downloader.TotalDownloadCount == 0)
{
Log.Warning($"{package.PackageName} all 没有资源更新");
return 0;
}
totalDownloadCount++;
//需要下载的文件总数和总大小
Log.Warning($"{package.PackageName} 文件总数:{downloader.TotalDownloadCount}:::总大小:{downloader.TotalDownloadBytes}");
return downloader.TotalDownloadBytes;
}
private async UniTask<bool> GetDownload(ResourcePackage package)
{
var downloader = package.CreateResourceDownloader(10, 3, 60);
//注册回调方法
downloader.OnDownloadErrorCallback = OnDownloadErrorFunction;
downloader.OnDownloadProgressCallback = OnDownloadProgressUpdateFunction;
downloader.OnDownloadOverCallback = OnDownloadOverFunction;
downloader.OnStartDownloadFileCallback = OnStartDownloadFileFunction;
//开启下载
downloader.BeginDownload();
await downloader.ToUniTask();
//检测下载结果
if (downloader.Status == EOperationStatus.Succeed)
{
Log.Debug("更新完成!");
return true;
}
else
{
//下载失败
Log.Error("更新失败!");
return false;
}
}
#region yooasset下载回调函数
/// <summary>
/// 下载数据大小
/// </summary>
/// <param name="fileName"></param>
/// <param name="sizeBytes"></param>
/// <exception cref="NotImplementedException"></exception>
private void OnStartDownloadFileFunction(string fileName, long sizeBytes)
{
Log.Debug($"开始下载:文件名:{fileName}, 文件大小:{sizeBytes}");
}
/// <summary>
/// 下载完成与否
/// </summary>
/// <param name="isSucceed"></param>
/// <exception cref="NotImplementedException"></exception>
private void OnDownloadOverFunction(bool isSucceed)
{
Log.Debug("下载" + (isSucceed ? "成功" : "失败"));
}
/// <summary>
/// 更新中
/// </summary>
/// <param name="totalCount"></param>
/// <param name="currentCount"></param>
/// <param name="totalBytes"></param>
/// <param name="currentBytes"></param>
/// <exception cref="NotImplementedException"></exception>
private void OnDownloadProgressUpdateFunction(int totalCount, int currentCount, long totalBytes, long currentBytes)
{
2024-10-16 02:48:23 +08:00
EventUtil.DispatchEvent(HotMainEvent.DownloaderProgressUpdate,totalCount,currentCount,totalBytes,currentBytes);
2024-10-15 18:26:52 +08:00
Log.Debug($"文件总数:{totalCount}, 已下载文件数:{currentCount}, 下载总大小:{totalBytes}, 已下载大小:{currentBytes}");
}
/// <summary>
/// 下载出错
/// </summary>
/// <param name="fileName"></param>
/// <param name="error"></param>
/// <exception cref="NotImplementedException"></exception>
private void OnDownloadErrorFunction(string fileName, string error)
{
Log.Error($"下载出错:文件名:{fileName}, 错误信息:{error}");
}
#endregion
}
}