105 lines
3.4 KiB
C#
105 lines
3.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
} |