Zqdn/UnityProject/Assets/GameScripts/Main/Procedure/ProcedureCreateDownloader.cs
SD-20250415ABSO\Administrator 321e38cb79 冠军框架迁移
2025-04-18 19:18:15 +08:00

202 lines
7.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using TEngine;
using UnityEngine;
using UnityEngine.Networking;
using YooAsset;
using ProcedureOwner = TEngine.IFsm<TEngine.IProcedureManager>;
using Utility = TEngine.Utility;
namespace GameMain
{
public class ProcedureCreateDownloader : ProcedureBase
{
private int _curTryCount;
private const int MaxTryCount = 3;
public override bool UseNativeDialog { get; }
private ProcedureOwner _procedureOwner;
private ResourceDownloaderOperation _downloader;
private int _totalDownloadCount;
private string _totalSizeMb;
protected override void OnEnter(ProcedureOwner procedureOwner)
{
_procedureOwner = procedureOwner;
Log.Info("创建补丁下载器");
UILoadMgr.Show(UIDefine.UILoadUpdate,$"创建补丁下载器...");
CreateDownloader().Forget();
}
private async UniTaskVoid CreateDownloader()
{
await UniTask.Delay(TimeSpan.FromSeconds(0.5f));
_downloader = GameModule.Resource.CreateResourceDownloader();
if (_downloader.TotalDownloadCount == 0)
{
Log.Info("Not found any download files !");
ChangeState<ProcedureDownloadOver>(_procedureOwner);
}
else
{
//A total of 10 files were found that need to be downloaded
Log.Info($"Found total {_downloader.TotalDownloadCount} files that need download ");
// 发现新更新文件后,挂起流程系统
// 注意:开发者需要在下载前检测磁盘空间不足
_totalDownloadCount = _downloader.TotalDownloadCount;
long totalDownloadBytes = _downloader.TotalDownloadBytes;
float sizeMb = totalDownloadBytes / 1048576f;
sizeMb = Mathf.Clamp(sizeMb, 0.1f, float.MaxValue);
_totalSizeMb = sizeMb.ToString("f1");
if (!SettingsUtils.EnableUpdateData())
{
// UILoadTip.ShowMessageBox($"Found update patch files, Total count {_totalDownloadCount} Total size {_totalSizeMb}MB", MessageShowType.TwoButton,
// LoadStyle.StyleEnum.Style_StartUpdate_Notice
// , StartDownFile, Application.Quit);
StartDownFile(); // 强制更新
}
else
{
RequestUpdateData().Forget();
}
}
}
void StartDownFile()
{
ChangeState<ProcedureDownloadFile>(_procedureOwner);
}
/// <summary>
/// 请求更新配置数据。
/// </summary>
private async UniTaskVoid RequestUpdateData()
{
Log.Warning("On RequestVersion");
_curTryCount++;
if (_curTryCount > MaxTryCount)
{
UILoadTip.ShowMessageBox(LoadText.Instance.Label_Net_Error, MessageShowType.TwoButton,
LoadStyle.StyleEnum.Style_Retry,
() =>
{
_curTryCount = 0;
RequestUpdateData().Forget();
}, Application.Quit);
return;
}
var checkVersionUrl = SettingsUtils.GetUpdateDataUrl();
UILoadMgr.Show(UIDefine.UILoadUpdate, string.Format(LoadText.Instance.Label_Load_Checking, _curTryCount));
if (string.IsNullOrEmpty(checkVersionUrl))
{
Log.Error("LoadMgr.RequestVersion, remote url is empty or null");
UILoadTip.ShowMessageBox(LoadText.Instance.Label_RemoteUrlisNull, MessageShowType.OneButton,
LoadStyle.StyleEnum.Style_QuitApp,
Application.Quit);
return;
}
Log.Info("RequestUpdateData, proxy:" + checkVersionUrl);
var updateDataStr = await Utility.Http.Get(checkVersionUrl);
try
{
UpdateData updateData = Utility.Json.ToObject<UpdateData>(updateDataStr);
ShowUpdateType(updateData);
}
catch (Exception e)
{
Log.Fatal(e);
throw;
}
}
/// <summary>
/// 显示更新方式
/// </summary>
/// <returns></returns>
private void ShowUpdateType(UpdateData data)
{
UILoadMgr.Show(UIDefine.UILoadUpdate, LoadText.Instance.Label_Load_Checked);
//底包更新
if (data.UpdateType == UpdateType.PackageUpdate)
{
UILoadTip.ShowMessageBox(LoadText.Instance.Label_Load_Package, MessageShowType.OneButton,
LoadStyle.StyleEnum.Style_DownLoadApk,
() =>
{
Log.Info("自定义下载APK");
Application.Quit();
});
}
//资源更新
else if (data.UpdateType == UpdateType.ResourceUpdate)
{
//强制
if (data.UpdateStyle == UpdateStyle.Force)
{
//提示
if (data.UpdateNotice == UpdateNotice.Notice)
{
NetworkReachability networkReachability = Application.internetReachability;
string desc = LoadText.Instance.Label_Load_Force_WIFI;
if (networkReachability == NetworkReachability.ReachableViaCarrierDataNetwork)
{
desc = LoadText.Instance.Label_Load_Force_NO_WIFI;
}
desc = string.Format(desc, $"{_totalSizeMb}MB");
UILoadTip.ShowMessageBox(desc, MessageShowType.TwoButton,
LoadStyle.StyleEnum.Style_StartUpdate_Notice,
StartDownFile, Application.Quit);
}
//不提示
else if (data.UpdateNotice == UpdateNotice.NoNotice)
{
StartDownFile();
}
}
//非强制
else if (data.UpdateStyle == UpdateStyle.Optional)
{
//提示
if (data.UpdateNotice == UpdateNotice.Notice)
{
UILoadTip.ShowMessageBox(string.Format(LoadText.Instance.Label_Load_Notice,$"{_totalSizeMb}MB"), MessageShowType.TwoButton,
LoadStyle.StyleEnum.Style_StartUpdate_Notice,
StartDownFile, () =>
{
ChangeState<ProcedureLoadAssembly>(_procedureOwner);
});
}
//不提示
else if (data.UpdateNotice == UpdateNotice.NoNotice)
{
StartDownFile();
}
}
else
{
Log.Error("LoadMgr._CheckUpdate, style is error,code:" + data.UpdateStyle);
}
}
}
}
}