| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | using Fort23.Core;using UnityEngine;namespace Core.UI.UTool{    public class AccumulatorUtility    {        public class AccumulationData        {            public float currentTotal;            public float targetTotal;            public float duration;            public System.Action<float> onIncrement;            public System.Action onComplete;        }        /// <summary>        /// 开始精确累加        /// </summary>        public static async void StartAccumulation(int targetTotal, float duration, int steps,            System.Action<int> onStep, System.Action onComplete = null)        {            int stepValue = targetTotal / (steps);            float timePerStep = duration / steps;            int currentTotal = 0;            for (int i = 0; i < steps-1; i++)            {                await TimerComponent.Instance.WaitAsync((int)(timePerStep * 1000));                currentTotal += stepValue;                onStep?.Invoke(stepValue);            }            // 确保最终精度            // currentTotal = targetTotal;            onStep?.Invoke(targetTotal - currentTotal);            onComplete?.Invoke();        }        /// <summary>        /// 开始实时累加(基于Update)        /// </summary>        public static async void StartRealtimeAccumulation(AccumulationData data)        {            float timer = 0f;            data.currentTotal = 0f;            while (timer < data.duration)            {                timer += Time.deltaTime;                float progress = timer / data.duration;                float newTotal = progress * data.targetTotal;                float increment = newTotal - data.currentTotal;                if (increment > 0)                {                    data.currentTotal = newTotal;                    data.onIncrement?.Invoke(data.currentTotal);                }                // yield return null;            }            data.currentTotal = data.targetTotal;            data.onIncrement?.Invoke(data.currentTotal);            data.onComplete?.Invoke();        }    }}
 |