OneShotOneKill/Assets/Script/UGUI/Util/SliderBase.cs

105 lines
3.4 KiB
C#
Raw Normal View History

2026-01-07 21:27:42 +00:00
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<bool> act_GageEnd;
#if UNITY_EDITOR
private void Reset()
{
m_slider = GetComponent<Slider>();
for (int i = 0; i < transform.childCount; i++)
{
var sd = transform.GetChild(i).GetComponent<Slider>();
if (sd != null)
{
m_middleslider = sd;
break;
}
}
m_slider.fillRect.GetComponent<Image>().type = Image.Type.Filled;
m_slider.fillRect.GetComponent<Image>().fillMethod = Image.FillMethod.Horizontal;
m_middleslider.fillRect.GetComponent<Image>().type = Image.Type.Filled;
m_middleslider.fillRect.GetComponent<Image>().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<bool> 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);
}
}
}
}