using System; using UnityEngine; using UnityEngine.UI; public class SliderBase : MonoBehaviour { [Header("슬라이더")] public Slider m_slider; // 즉시 반영 (현재 HP) public Slider m_middleslider; // 지연 반영 (잔상) [Header("설정값")] public float followDelay = 0.3f; // 잔상 딜레이 (초) public float followSpeed = 3f; // 따라가는 속도 float targetValue; float delayTimer; private float velocity; // SmoothDamp용 내부 속도 변수 bool isDecreasing; // 감소 중인지 판별 bool isFinished; // 완료 콜백 중복 방지 Action act_GageEnd; #if UNITY_EDITOR private void Reset() { m_slider = GetComponent(); for (int i = 0; i < transform.childCount; i++) { var sd = transform.GetChild(i).GetComponent(); if (sd != null) { m_middleslider = sd; break; } } m_slider.fillRect.GetComponent().type = Image.Type.Filled; m_slider.fillRect.GetComponent().fillMethod = Image.FillMethod.Horizontal; m_middleslider.fillRect.GetComponent().type = Image.Type.Filled; m_middleslider.fillRect.GetComponent().fillMethod = Image.FillMethod.Horizontal; } #endif public void Set(float v) { m_slider.value = m_middleslider.value = DSUtil.Get_SliderValue(v); targetValue = Mathf.Min(1f, v); isFinished = true; // 초기 세팅은 즉시 완료 상태로 간주 } public void Set_Next(float v, Action actgageend = null) { act_GageEnd = actgageend; isDecreasing = v < targetValue; // 이전 targetValue와 비교 targetValue = Mathf.Min(1f, v); delayTimer = 0f; isFinished = false; if (isDecreasing) m_slider.value = DSUtil.Get_SliderValue(v); // 즉시 반영 else m_middleslider.value = DSUtil.Get_SliderValue(v); // 즉시 반영 } private void Update() { delayTimer += Time.deltaTime; if (isDecreasing) { if (delayTimer >= followDelay) { if (delayTimer >= followDelay) { m_middleslider.value = DSUtil.Get_SliderValue(Mathf.Lerp( m_middleslider.value, targetValue, Time.deltaTime * followSpeed )); // 목표값에 충분히 근접하면 종료 처리 if (!isFinished && Mathf.Abs(m_middleslider.value - targetValue) < 0.001f) { m_middleslider.value = DSUtil.Get_SliderValue(targetValue); isFinished = true; act_GageEnd?.Invoke(targetValue >= 1f); } } } } else { // SmoothDamp으로 자연스러운 상승 m_slider.value = DSUtil.Get_SliderValue( Mathf.SmoothDamp(m_slider.value, targetValue, ref velocity, 0.225f) ); if (!isFinished && Mathf.Abs(m_slider.value - targetValue) < 0.001f) { m_slider.value = DSUtil.Get_SliderValue(targetValue); isFinished = true; act_GageEnd?.Invoke(targetValue >= 1f); } } } }