using System; using System.Collections; using System.Collections.Generic; using ChivaXR; using Sirenix.OdinInspector; using TMPro; using UnityEngine; using UnityEngine.UI; /// /// 倒计时 /// public class AniDriver_Countdown : AnimationDriverBase { [LabelText("总时长")] [SerializeField] private int m_TotalTime; [BoxGroup("显示时间(TMP模式与Text模式二选一即可)")] [LabelText("TMP模式")] [SerializeField] private TMP_Text m_ShowTimeTMP; [BoxGroup("显示时间(TMP模式与Text模式二选一即可)")] [LabelText("Text模式")] [SerializeField] private Text m_ShoeTimeText; [LabelText("持续时间")] [SerializeField] private float m_Duration; [LabelText("呈现显示")] [SerializeField] private string m_ShowTitle; public override void InitState() { } public override void FinishedState() { SetPanelInfo(0); } public override void StartPlay(Action finishedCallBack = null) { StartAniCoroutine(ReduceDurationOverTime(finishedCallBack)); } IEnumerator ReduceDurationOverTime(Action finishedCallBack = null) { // 记录开始时间 float startTime = Time.time; // 计算结束时间 float endTime = startTime + m_Duration; // 记录初始总时长 int initialDuration = m_TotalTime; while (Time.time < endTime) { // 计算衰减比例 float t = (Time.time - startTime) / m_Duration; // 根据衰减比例更新totalDuration m_TotalTime = Mathf.RoundToInt(Mathf.Lerp(initialDuration, 0, t)); // 输出当前的totalDuration SetPanelInfo(m_TotalTime); // 等待下一帧 yield return null; } // 确保最终的totalDuration为0 m_TotalTime = 0; finishedCallBack?.Invoke(); } private void SetPanelInfo(int _currentTime) { string timeText = _currentTime != 0 ? _currentTime + "s" : m_ShowTitle; if (m_ShoeTimeText != null) { m_ShoeTimeText.text = timeText; } else if (m_ShowTimeTMP != null) { m_ShowTimeTMP.text = timeText; } else { m_ShoeTimeText.text = String.Empty; m_ShowTimeTMP.text = String.Empty; } } }