AlicizaX/Client/Assets/Scripts/Startup/LauncherUIHandler.cs
2026-03-23 20:50:25 +08:00

102 lines
3.5 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 System;
using System.Collections;
using System.Collections.Generic;
using AlicizaX.Resource.Runtime;
using AlicizaX.Localization.Runtime;
using AlicizaX;
using Cysharp.Threading.Tasks;
using Game.UI;
using UnityEngine;
namespace Unity.Startup.Procedure
{
public static class LauncherUIHandler
{
static EventRuntimeHandle eventRuntimeHandle;
public static void Start()
{
eventRuntimeHandle = EventBus.Subscribe<AssetDownloadProgressUpdateEventArgs>(SetProgressUpdate);
GameApp.UI.ShowUI<UIGameLaunchWindow>();
}
public static void Dispose()
{
eventRuntimeHandle.Dispose();
GameApp.UI.CloseUI<UIGameLaunchWindow>();
}
private static float _lastUpdateDownloadedSize;
private static float _totalSpeed;
private static int _speedSampleCount;
private static long _currentDownloadBytes;
private static float CurrentSpeed
{
get
{
float interval = Math.Max(Time.deltaTime, 0.01f); // 防止deltaTime过小
var sizeDiff = _currentDownloadBytes - _lastUpdateDownloadedSize;
_lastUpdateDownloadedSize = _currentDownloadBytes;
var speed = sizeDiff / interval;
// 使用滑动窗口计算平均速度
_totalSpeed += speed;
_speedSampleCount++;
return _totalSpeed / _speedSampleCount;
}
}
public static IEnumerator StartProgressCoroutine(float duration)
{
float elapsed = 0f;
while (elapsed < duration)
{
float progress = elapsed / duration;
Progress(progress);
elapsed += Time.deltaTime;
yield return null;
}
Progress(1f);
}
private static void Progress(float v)
{
// _uiLoadUpdateWindow.SetProgressText(v );
}
private static void SetProgressUpdate(AssetDownloadProgressUpdateEventArgs gameEventArgs)
{
var message = (AssetDownloadProgressUpdateEventArgs)gameEventArgs;
_currentDownloadBytes = message.CurrentDownloadSizeBytes;
float progress = message.CurrentDownloadSizeBytes / (message.TotalDownloadSizeBytes * 1f);
string currentSizeMb = Utility.File.GetBytesSize(message.CurrentDownloadSizeBytes);
string totalSizeMb = Utility.File.GetBytesSize(message.TotalDownloadSizeBytes);
string speed = Utility.File.GetLengthString((int)CurrentSpeed);
string line1 = Utility.Text.Format("正在更新,已更新 {0}/{1} ({2:F2}%)", message.CurrentDownloadCount, message.TotalDownloadCount, progress);
string line2 = Utility.Text.Format("已更新大小 {0}MB/{1}MB", currentSizeMb, totalSizeMb);
string line3 = Utility.Text.Format("当前网速 {0}/s剩余时间 {1}", speed, GetRemainingTime(message.TotalDownloadSizeBytes, message.CurrentDownloadSizeBytes, CurrentSpeed));
Log.Info($"{line1} \n {line2}\n {line3}");
}
private static string GetRemainingTime(long totalBytes, long currentBytes, float speed)
{
int needTime = 0;
if (speed > 0)
{
needTime = (int)((totalBytes - currentBytes) / speed);
}
TimeSpan ts = new TimeSpan(0, 0, needTime);
return ts.ToString(@"mm\:ss");
}
}
}