AlicizaX/Client/Assets/Scripts/Startup/LauncherUIHandler.cs

102 lines
3.5 KiB
C#
Raw Permalink Normal View History

2025-01-23 19:06:48 +08:00
using System;
2025-04-28 19:45:45 +08:00
using System.Collections;
using System.Collections.Generic;
2025-01-23 19:06:48 +08:00
using AlicizaX.Resource.Runtime;
2025-04-28 19:45:45 +08:00
using AlicizaX.Localization.Runtime;
using AlicizaX;
using Cysharp.Threading.Tasks;
2025-11-14 13:34:21 +08:00
using Game.UI;
2025-01-23 19:06:48 +08:00
using UnityEngine;
namespace Unity.Startup.Procedure
{
public static class LauncherUIHandler
{
2025-10-14 15:42:34 +08:00
static EventRuntimeHandle eventRuntimeHandle;
public static void Start()
2025-01-23 19:06:48 +08:00
{
2026-03-23 20:50:25 +08:00
eventRuntimeHandle = EventBus.Subscribe<AssetDownloadProgressUpdateEventArgs>(SetProgressUpdate);
2025-11-14 13:34:21 +08:00
GameApp.UI.ShowUI<UIGameLaunchWindow>();
2025-01-23 19:06:48 +08:00
}
public static void Dispose()
{
2025-09-02 16:30:55 +08:00
eventRuntimeHandle.Dispose();
2025-12-26 14:23:01 +08:00
GameApp.UI.CloseUI<UIGameLaunchWindow>();
2025-01-23 19:06:48 +08:00
}
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;
}
}
2025-04-28 19:45:45 +08:00
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 );
}
2025-09-02 16:30:55 +08:00
private static void SetProgressUpdate(AssetDownloadProgressUpdateEventArgs gameEventArgs)
2025-01-23 19:06:48 +08:00
{
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");
}
}
2025-01-26 20:55:39 +08:00
}