using UnityEngine; using UnityEngine.UI; using Cysharp.Threading.Tasks; using System; using System.Threading; /// /// 战斗加载界面,显示战斗资源加载进度。 /// 在战斗资源异步加载期间展示,加载完成后自动关闭。 /// public class BattleLoadingWin : UIBase { [SerializeField] private Slider m_ProgressSlider; [SerializeField] private Text m_ProgressText; [SerializeField] private Text m_TipText; private float _currentProgress; private float _targetProgress; private bool _isComplete; /// /// 创建 IProgress<float> 适配器,用于集成异步加载的进度回报。 /// public IProgress CreateProgressReporter() { return new BattleLoadingProgress(this); } protected override void InitComponent() { base.InitComponent(); _currentProgress = 0f; _targetProgress = 0f; _isComplete = false; } protected override void OnPreOpen() { base.OnPreOpen(); _currentProgress = 0f; _targetProgress = 0f; _isComplete = false; UpdateUI(); RefreshTip(); } /// /// 设置加载进度 (0.0 ~ 1.0)。 /// public void SetProgress(float progress) { _targetProgress = Mathf.Clamp01(progress); if (_targetProgress >= 1f) { _isComplete = true; } } /// /// 直接设置进度并刷新 UI(无平滑过渡)。 /// public void SetProgressDirectly(float progress) { _targetProgress = Mathf.Clamp01(progress); _currentProgress = _targetProgress; UpdateUI(); if (_targetProgress >= 1f) { _isComplete = true; } } private void LateUpdate() { if (Mathf.Abs(_currentProgress - _targetProgress) > 0.001f) { _currentProgress = Mathf.Lerp(_currentProgress, _targetProgress, Time.deltaTime * 5f); // 接近目标时直接对齐,避免无限趋近 if (Mathf.Abs(_currentProgress - _targetProgress) < 0.005f) { _currentProgress = _targetProgress; } UpdateUI(); } if (_isComplete && _currentProgress >= 0.99f) { _currentProgress = 1f; UpdateUI(); OnLoadComplete(); } } private void UpdateUI() { if (m_ProgressSlider != null) { m_ProgressSlider.value = _currentProgress; } if (m_ProgressText != null) { m_ProgressText.text = $"{(int)(_currentProgress * 100)}%"; } } private void RefreshTip() { if (m_TipText != null && GeneralDefine.loadingTips != null && GeneralDefine.loadingTips.Length > 0) { var randomIndex = UnityEngine.Random.Range(0, GeneralDefine.loadingTips.Length); m_TipText.text = Language.Get(GeneralDefine.loadingTips[randomIndex]); } } private void OnLoadComplete() { // 延迟关闭,让玩家看到 100% 状态 CompleteAndCloseAsync().Forget(); } private async UniTask CompleteAndCloseAsync() { await UniTask.Delay(300, cancellationToken: this.GetCancellationTokenOnDestroy()); if (this != null) { UIManager.Instance.CloseWindow(this); } } /// /// 显示战斗加载界面并返回进度回报器。 /// 用法: var progress = await BattleLoadingWin.ShowAsync(); /// public static async UniTask ShowAsync() { var win = await UIManager.Instance.OpenWindowAsync("BattleLoadingWin") as BattleLoadingWin; return win; } /// /// IProgress 适配器实现。 /// private class BattleLoadingProgress : IProgress { private readonly BattleLoadingWin _win; public BattleLoadingProgress(BattleLoadingWin win) { _win = win; } public void Report(float value) { if (_win != null) { _win.SetProgress(value); } } } }