using System; using Fort23.Core; using UnityEngine; using Utility.CTween; public class CustomFloatTween : CustomTweener { public CustomGetter Getter; public CustomSetter Setter; public float EndValue; public float StartValue; public float CurValue; private GameObject _target; public CustomFloatTween CustomInit(CustomGetter getter, CustomSetter setter, float endValue, float duration, GameObject target) { _target = target; _tempTimer = 0; _curTime = 0; Duration = 0; _isPause = false; _isKilled = false; _isComplete = false; Duration = duration; Getter = getter; Setter = setter; EndValue = endValue; StartValue = Getter(); Update(); return this; } public override void Update() { if (_target == null) { Kill(); return; } if (_isPause || _isKilled || _isComplete) { return; } _isPlaying = true; _curTime += Time.deltaTime; float rate = 1 / Duration; //相对速率 _tempTimer += Time.deltaTime * rate; _tempTimer = Mathf.Clamp(_tempTimer, 0, 1); float v = AnimationCurve.Evaluate(_tempTimer); float pNewValue = Mathf.Lerp(StartValue, EndValue, v); CurValue = pNewValue; Setter?.Invoke(pNewValue); OnUpdateAction?.Invoke(); OnUpdateAndValueAction?.Invoke(pNewValue); if (_curTime >= Duration) { OnCompleteAction?.Invoke(); _isPlaying = false; _isComplete = true; if (AutoDispose) { Kill(); } } } public void ReStart(float endValue = -1, float duration = -1) { _tempTimer = 0; _curTime = 0; // Duration = 0; _isPause = false; _isKilled = false; _isComplete = false; if (Math.Abs(endValue - (-1)) > 0.001f) { EndValue = endValue; } if (Math.Abs(duration - (-1)) > 0.001f) { Duration = duration; } CustomInit(Getter, Setter, EndValue, Duration, _target); } public override void Dispose() { if (_target != null) { Setter?.Invoke(EndValue); OnCompleteAction?.Invoke(); } base.Dispose(); _target = null; Getter = null; Setter = null; CustomTweenManager.FloatRecycle(this); } }