using System; using System.Collections; using System.Collections.Generic; using AlicizaX.Resource.Runtime; using AlicizaX.Event.Runtime; using AlicizaX.Localization.Runtime; using AlicizaX; using Cysharp.Threading.Tasks; // using Unity.Startup.UI; using UnityEngine; namespace Unity.Startup.Procedure { public static class LauncherUIHandler { // private static UILoadUpdateWindow _uiLoadUpdateWindow; public static async UniTaskVoid Start() { // _uiLoadUpdateWindow = await GameApp.UI.ShowUIAsync(); GameApp.Event.Subscribe(AssetDownloadProgressUpdateEventArgs.EventId, SetProgressUpdate); // GameApp.Event.Subscribe(AssetPatchStatesChangeEventArgs.EventId, SetPatchStates); await UniTask.CompletedTask; // TextAsset config = Resources.Load($"Localization/{AppBuilderSetting.Instance.Language.ToString()}"); // Dictionary dic = Utility.Json.ToObject>(config.text); // GameApp.Localization.AddLocalizationConfig(dic); // Resources.UnloadAsset(config); } public static void Dispose() { // GameApp.UI.CloseUI(); // GameApp.Event.Unsubscribe(AssetPatchStatesChangeEventArgs.EventId, SetPatchStates); GameApp.Event.Unsubscribe(AssetDownloadProgressUpdateEventArgs.EventId, SetProgressUpdate); } 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 SetPatchStates(object sender, GameEventArgs gameEventArgs) { // var message = (AssetPatchStatesChangeEventArgs)gameEventArgs; // _uiLoadUpdateWindow.SetDescText(GameApp.Localization.GetString(message.CurrentStates.ToString())); // Debug.Log(message.CurrentStates); } private static void SetProgressUpdate(object sender, GameEventArgs 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"); } } }