123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- using Fort23.Core;
- using TMPro;
- using UnityEngine;
- using UnityEngine.UI;
- namespace Fort23.Mono
- {
- /// <summary>
- /// 数字变化
- /// </summary>
- public class AnimateNumber
- {
- private Text targetTxt;
- private TextMeshProUGUI targetTextPro;
- private long startValue;
- private long endValue;
- private float time;
- private float timeElapsed;
-
- public AnimateNumber(Text targetTxt = null, TextMeshProUGUI targetTextPro = null)
- {
- this.targetTxt = targetTxt;
- this.targetTextPro = targetTextPro;
- }
-
- public void Start(long startValue, long endValue, float time = 0.3f)
- {
- this.startValue = startValue;
- this.endValue = endValue;
- this.time = time;
-
- timeElapsed = 0f; // 已经过的时间
- StaticUpdater.Instance.RemoveRenderUpdateCallBack(Animate);
- StaticUpdater.Instance.AddRenderUpdateCallBack(Animate);
- }
- public async void Reset()
- {
- StaticUpdater.Instance.RemoveRenderUpdateCallBack(Animate);
- await TimerComponent.Instance.WaitAsync(1);
- }
-
- private void Animate()
- {
- if (timeElapsed < time)
- {
- // 计算当前数字(插值)
- float currentValue = Mathf.Lerp(startValue, endValue, timeElapsed / time);
- // 将当前数字四舍五入并设置到目标文本
- SetText(Mathf.RoundToInt(currentValue).ToString());
-
- timeElapsed += Time.deltaTime; // 增加经过的时间
- }
- else
- {
- // 确保最终值精确设置
- SetText(endValue.ToString());
- StaticUpdater.Instance.RemoveRenderUpdateCallBack(Animate);
- }
- }
- private void SetText(string text)
- {
- if (targetTxt != null)
- {
- targetTxt.text = text;
- }
- if (targetTextPro != null)
- {
- targetTextPro.text = text;
- }
- }
- }
- }
|