using Cysharp.Threading.Tasks; using Gameplay; using System; using System.Text; public class TimerText { private TimerTextTimer _timerTextTimer; private TMPro.TextMeshProUGUI text; public void Init(TMPro.TextMeshProUGUI text) { if (_timerTextTimer == null) { _timerTextTimer = new TimerTextTimer(); } this.text = text; } public void SetTimer(float time) { if (_timerTextTimer == null || text == null) { DebugUtil.LogError("暂未初始化TimerText, 请先调用Init方法进行初始化!"); return; } _timerTextTimer.SetTimer(time); } public void StartTimer() { _timerTextTimer.StartTimer(); _timerTextTimer.OnValueChanged += OnValueChange; } public void StopTimer() { _timerTextTimer.StopTimer(); _timerTextTimer.OnValueChanged -= OnValueChange; } void OnValueChange(float time) { TimeSpan remains = TimeSpan.FromSeconds(time); var day = remains.Days; var hour = remains.Hours; var minute = remains.Minutes; var second = remains.Seconds; StringBuilder sb = new StringBuilder(); sb.Append(CommonUtils.GetLocalizeText("剩余")); if (day > 0) sb.Append($"{day}d {hour:D2}h"); else if (hour > 0) sb.Append($"{hour:D2}h {minute:D2}m {second:D2}s"); else if (minute > 0) sb.Append($"{minute:D2}m {second:D2}s"); else sb.Append($"{second:D2}s"); text.text = sb.ToString(); } } public class TimerTextTimer { private float RemainingTime; private bool IsRunning; public delegate void OnValueChange(float time); public event OnValueChange OnValueChanged; public delegate void OnTimerEnd(); public event OnTimerEnd OnTimerEndEvent; public void SetTimer(float time) { RemainingTime = time; } public void StartTimer() { if (IsRunning) return; IsRunning = true; CoreTimer(); } public void StopTimer() { IsRunning = false; } async void CoreTimer() { while (IsRunning) { await UniTask.Delay(1000); RemainingTime--; OnValueChanged?.Invoke(RemainingTime); if (RemainingTime <= 0) { StopTimer(); OnTimerEndEvent?.Invoke(); } } } }