슬라이더에 포함된 핸들을 좌우 또는 상하로 밀어서 값을 조절하는 상호작용 UI입니다.

핸들 = 슬라이더에서 마우스로 잡고 움직일 수 있는 버튼.

using UnityEngine.UI;
public class Slider_UI : MonoBehaviour
{
[SerializeField]
Slider slider;
[SerializeField]
TextMeshProUGUI text; // *타입 주의 (UGUI까지 붙여야함)
public void OnSliderEvent(float volume)
{
text.text = $"Volume {volume * 100:F1}%";
}
}

작성한 스크립트를 Slider 컴포넌트에 부착, 연결해줍니다.

OnValueChanged 이벤트에 {Dynamic} OnSliderEvent를 등록합니다.

using UnityEngine.UI;
public class Slider_UI : MonoBehaviour
{
[SerializeField]
Slider slider;
[SerializeField]
TextMeshProUGUI text;
private void Awake()
{
slider.onValueChanged.AddListener(OnSliderEvent); //콜백함수 등록
}
public void OnSliderEvent(float volume)
{
text.text = $"Volume {volume * 100:F1}%";
}
}
위에서 등록했던 유니티 이벤트는 삭제 해주고 스크립트로
Awake 부분에 콜백함수를 등록합니다.
using UnityEngine.UI;
public class Slider_UI : MonoBehaviour
{
[SerializeField]
Slider slider;
[SerializeField]
SpriteRenderer spriteRenderer;
[SerializeField]
TextMeshProUGUI alpha;
private void Awake()
{
slider.onValueChanged.AddListener(OnSliderEvent);
}
public void OnSliderEvent(float volume)
{
Color color = spriteRenderer.color;
color.a = volume;
spriteRenderer.color = color;
alpha.text = $"Alpha {volume * 255:F1}%";
}
}

Sprite Renderer 컴포넌트를 부착한 게임 오브젝트에 스프라이트 이미지를 등록하고
Slider에 연결해줍니다.


HP 바로 사용할 Slider에서 핸들을 삭제 합니다.

HP바는 상호작용할 일이 없으므로 Interactable도 체크 해제합니다.

Fill 이미지를 빨간색으로 해주고 위치를 조정합니다.

테스트를 위해 플레이어를 공격할 버튼을 생성합니다.
using UnityEngine.UI;
public class Slider_UI : MonoBehaviour
{
[SerializeField]
private SpriteRenderer playerRenderer;
[SerializeField]
private TextMeshProUGUI textHP; // 플레이어의 체력 텍스트 (현재체력/최대체력)
[SerializeField]
private Slider sliderHP; // 플레이어의 체력 게이지
[SerializeField]
private Button buttonAttack; // 공격 버튼
private float maxHP = 100; // 최대 체력
private float currentHP; // 현재 체력
private float damage = 12; // 공격력 (damage만큼 체력 감소)
private void Awake()
{
currentHP = maxHP;
}
public void OnClickEventAttack()
{
if (currentHP > 0)
{
currentHP -= damage;
currentHP = Mathf.Max(currentHP, 0);
sliderHP.value = currentHP / maxHP;
textHP.text = $"{currentHP}/{maxHP}";
StartCoroutine("ColorAnimation");
}
if (currentHP <= 0)
{
buttonAttack.interactable = false;
}
}
private IEnumerator ColorAnimation()
{
playerRenderer.color = Color.red;
yield return new WaitForSeconds(0.1f);
playerRenderer.color = Color.white;
}
}

스크립트를 작성하고 인스펙터에서 필요한 각 오브젝트를 연동합니다.

마지막으로 버튼을 누르면 OnClick 이벤트가 실행될수 있도록 콜백함수를 등록합니다
