using Fort23.Core; using TMPro; using UnityEngine; using UnityEngine.UI; namespace Fort23.Mono { /// /// 数字变化 /// 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; } } } }