AkiraPixelWind/Assets/Scripts/Main/Procedure/ProcedureUpdateVersion.cs
2022-12-29 18:20:40 +08:00

201 lines
6.7 KiB
C#
Raw Permalink 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 Axibug;
using Axibug.Event;
using Axibug.Procedure;
using Axibug.Resources;
using Axibug.Runtime;
using System.IO;
using UnityEngine;
using static Axibug.Utility;
using ProcedureOwner = Axibug.Fsm.IFsm<Axibug.Procedure.IProcedureManager>;
namespace Game
{
public class ProcedureUpdateVersion : ProcedureBase
{
private int _downloadCount = 0; //下载次数
private int _needDownloadFileCount; //本次需要处理下载的文件数量
private int _downloadFileCount; //已处理下载的文件数量
NativeUpdateUI _updateUI;
float delayTime = 0;
private void downloadFiles()
{
_needDownloadFileCount = HotData.curHot.diff.Count;
Log.Debug($"本次需下载文件数量:{_needDownloadFileCount}");
_downloadFileCount = 0;
for (int i = 0; i < HotData.curHot.diff.Count; i++)
{
var fd = HotData.curHot.diff[i];
string path = Utility.Path.GetRemoteFilePath(HotData.curHot.version_remote, fd.filename);
Log.Debug($"请求路径:{path}");
AppEntry.WebRequest.AddWebRequest(path, fd);
}
_downloadCount++;
}
protected override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
Log.Debug($"开始更新...你的更新路径为:{Application.persistentDataPath}");
_updateUI = AppEntry.OpenNativeUI<NativeUpdateUI>("NativeUpdateUI");
if (_updateUI == null)
throw new GameException("获取内置update界面失败");
_downloadCount = 0;
AppEntry.Event.Subscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
AppEntry.Event.Subscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
downloadFiles();
}
private void OnWebRequestSuccess(object sender, LogicEventArgs e)
{
WebRequestSuccessEventArgs ne = (WebRequestSuccessEventArgs)e;
FileData fd = (FileData)ne.UserData;
Log.Debug("下载文件成功:" + fd.toString());
byte[] bytes = ne.GetWebResponseBytes();
string fileString = Converter.GetString(bytes);
//加上文件大小
HotData.curHot.curBytes += bytes.Length;
string mes = $"正在更新:{AppEntry.HotUpdate.GetByteLengthString(HotData.curHot.curBytes)} / {AppEntry.HotUpdate.GetByteLengthString(HotData.curHot.totalBytes)} " +
$"文件: {_downloadFileCount + 1} / {_needDownloadFileCount}";
float v = (float)HotData.curHot.curBytes / HotData.curHot.totalBytes;
//显示进程
if (_updateUI != null)
_updateUI.RefreshPregress(mes, v);
//写入热更文件
WriteUpdateFile(fd.filename, bytes);
//移除差异文件
HotData.curHot.diff.Remove((FileData)ne.UserData);
_downloadFileCount++;
}
private void OnWebRequestFailure(object sender, LogicEventArgs e)
{
Log.Debug("failed");
_downloadFileCount++;
}
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
//一次下载完
if (_needDownloadFileCount == _downloadFileCount)
{
//如果还有文件没下载,重下
if (HotData.curHot.diff.Count > 0)
{
//下载次数超过5次还是失败即提醒
if (_downloadCount >= 5)
{
//HotfixEntry.UI.ShowMessageBox("系统提示", "网络连接异常,是否重试", "重试", "退出",
AppEntry.ShowMessageBox("系统提示", "网络连接异常,是否重试", "重试", "退出",
() =>
{
_downloadCount = 0;
downloadFiles();
},
() => { AppEntry.QuitGame(); });
}
else
{
//没超过5次自动重下
downloadFiles();
}
return;
}
if (_updateUI != null)
_updateUI.RefreshPregress("文件下载完成,正在解压...", 1);
delayTime += elapseSeconds;
if (delayTime < 1)
return;
//进入游戏
WriteVersion();
ChangeState<ProcedureInitSystem>(procedureOwner);
}
}
protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
{
AppEntry.Event.Unsubscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
AppEntry.Event.Unsubscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
//删除更新界面框
//HotfixEntry.UI.CloseUI<NativeUpdateUI>();
AppEntry.CloseNativeUI("NativeUpdateUI");
_updateUI = null;
base.OnLeave(procedureOwner, isShutdown);
}
void WriteUpdateFile(string file, byte[] bytes)
{
string path = string.Empty;
//先创建文件夹
string[] tmp = file.Split('/');
string tmpDir = string.Empty;
//最后文件名的不创建
for (int i = 0; i < tmp.Length - 1; i++)
{
tmpDir += tmp[i];
path = Utility.Path.GetUpdateWriteFilePath(tmpDir);
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
tmpDir += '/';
}
path = Utility.Path.GetUpdateWriteFilePath(file);
Stream stream = File.Create(path, bytes.Length);
stream.Write(bytes, 0, bytes.Length);
stream.Close();
stream.Dispose();
//Log.Debug($"写入文件成功, path={path}");
}
//更新完成后,写入版本文件
void WriteVersion()
{
string path = Utility.Path.GetLocalVersionFilePath();
if (File.Exists(path))
File.Delete(path);
try
{
Stream stream = File.Create(path, HotData.curHot.bytes.Length);
stream.Write(HotData.curHot.bytes, 0, HotData.curHot.bytes.Length);
stream.Close();
stream.Dispose();
Log.Debug($"写入版本文件, path={path}");
}
catch (System.Exception ex)
{
Log.Error(ex.Message);
}
}
}
}