AnimateNumber.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Fort23.Core;
  2. using TMPro;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. namespace Fort23.Mono
  6. {
  7. /// <summary>
  8. /// 数字变化
  9. /// </summary>
  10. public class AnimateNumber
  11. {
  12. private Text targetTxt;
  13. private TextMeshProUGUI targetTextPro;
  14. private long startValue;
  15. private long endValue;
  16. private float time;
  17. private float timeElapsed;
  18. public AnimateNumber(Text targetTxt = null, TextMeshProUGUI targetTextPro = null)
  19. {
  20. this.targetTxt = targetTxt;
  21. this.targetTextPro = targetTextPro;
  22. }
  23. public void Start(long startValue, long endValue, float time = 0.3f)
  24. {
  25. this.startValue = startValue;
  26. this.endValue = endValue;
  27. this.time = time;
  28. timeElapsed = 0f; // 已经过的时间
  29. StaticUpdater.Instance.RemoveRenderUpdateCallBack(Animate);
  30. StaticUpdater.Instance.AddRenderUpdateCallBack(Animate);
  31. }
  32. public async void Reset()
  33. {
  34. StaticUpdater.Instance.RemoveRenderUpdateCallBack(Animate);
  35. await TimerComponent.Instance.WaitAsync(1);
  36. }
  37. private void Animate()
  38. {
  39. if (timeElapsed < time)
  40. {
  41. // 计算当前数字(插值)
  42. float currentValue = Mathf.Lerp(startValue, endValue, timeElapsed / time);
  43. // 将当前数字四舍五入并设置到目标文本
  44. SetText(Mathf.RoundToInt(currentValue).ToString());
  45. timeElapsed += Time.deltaTime; // 增加经过的时间
  46. }
  47. else
  48. {
  49. // 确保最终值精确设置
  50. SetText(endValue.ToString());
  51. StaticUpdater.Instance.RemoveRenderUpdateCallBack(Animate);
  52. }
  53. }
  54. private void SetText(string text)
  55. {
  56. if (targetTxt != null)
  57. {
  58. targetTxt.text = text;
  59. }
  60. if (targetTextPro != null)
  61. {
  62. targetTextPro.text = text;
  63. }
  64. }
  65. }
  66. }