AniDriver_Countdown.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using ChivaXR;
  5. using Sirenix.OdinInspector;
  6. using TMPro;
  7. using UnityEngine;
  8. using UnityEngine.UI;
  9. /// <summary>
  10. /// 倒计时
  11. /// </summary>
  12. public class AniDriver_Countdown : AnimationDriverBase
  13. {
  14. [LabelText("总时长")]
  15. [SerializeField]
  16. private int m_TotalTime;
  17. [BoxGroup("显示时间(TMP模式与Text模式二选一即可)")]
  18. [LabelText("TMP模式")]
  19. [SerializeField]
  20. private TMP_Text m_ShowTimeTMP;
  21. [BoxGroup("显示时间(TMP模式与Text模式二选一即可)")]
  22. [LabelText("Text模式")]
  23. [SerializeField]
  24. private Text m_ShoeTimeText;
  25. [LabelText("持续时间")]
  26. [SerializeField]
  27. private float m_Duration;
  28. [LabelText("呈现显示")]
  29. [SerializeField]
  30. private string m_ShowTitle;
  31. public override void InitState()
  32. {
  33. }
  34. public override void FinishedState()
  35. {
  36. SetPanelInfo(0);
  37. }
  38. public override void StartPlay(Action finishedCallBack = null)
  39. {
  40. StartAniCoroutine(ReduceDurationOverTime(finishedCallBack));
  41. }
  42. IEnumerator ReduceDurationOverTime(Action finishedCallBack = null)
  43. {
  44. // 记录开始时间
  45. float startTime = Time.time;
  46. // 计算结束时间
  47. float endTime = startTime + m_Duration;
  48. // 记录初始总时长
  49. int initialDuration = m_TotalTime;
  50. while (Time.time < endTime)
  51. {
  52. // 计算衰减比例
  53. float t = (Time.time - startTime) / m_Duration;
  54. // 根据衰减比例更新totalDuration
  55. m_TotalTime = Mathf.RoundToInt(Mathf.Lerp(initialDuration, 0, t));
  56. // 输出当前的totalDuration
  57. SetPanelInfo(m_TotalTime);
  58. // 等待下一帧
  59. yield return null;
  60. }
  61. // 确保最终的totalDuration为0
  62. m_TotalTime = 0;
  63. finishedCallBack?.Invoke();
  64. }
  65. private void SetPanelInfo(int _currentTime)
  66. {
  67. string timeText = _currentTime != 0 ? _currentTime + "s" : m_ShowTitle;
  68. if (m_ShoeTimeText != null)
  69. {
  70. m_ShoeTimeText.text = timeText;
  71. }
  72. else if (m_ShowTimeTMP != null)
  73. {
  74. m_ShowTimeTMP.text = timeText;
  75. }
  76. else
  77. {
  78. m_ShoeTimeText.text = String.Empty;
  79. m_ShowTimeTMP.text = String.Empty;
  80. }
  81. }
  82. }