안녕하세요?
오늘은 유니티에서 Slider UI로 체력바를 구현해보도록 하겠습니다.
전에 만들었던 게임은 직접 background와 체력바 네모를 만들어서 구현하였는데, 오늘은 slider로 보다 쉽게 구현해보도록 하겠습니다.

먼저 UI > Slider를 생성해주고, Handle은 체력바를 구현할 때 필요없으므로 삭제해줍니다.

Fill Area > Fill의 Color를 빨간색 혹은 원하는 색으로 변경해주고요.
Slider 컴포넌트의 Transition -> None, Navigation -> None으로 변경해줍니다.


뭔가 다 한 것 같은데 Scene을 보면 체력바 게이지를 풀로 설정해도 약간 모자라고, 0으로 설정해도 약간 남아있습니다.


이럴 땐 Fill의 기본 설정인 Width = 10을 0으로 바꿔주고, Fill Area의 Left와 Right도 0으로 바꿔주면 된답니다.
이제 코드로 구현을 해보겠습니다.
using UnityEngine;
using UnityEngine.UI;
public class HPUIController : MonoBehaviour
{
public HPManager hpManager;
public Slider hpSlider;
void Start()
{
hpSlider.maxValue = hpManager.maxHP;
hpSlider.value = hpManager.currentHP;
hpManager.OnHPChanged += UpdateHPUI;
}
void UpdateHPUI(int current, int max)
{
hpSlider.maxValue = max;
hpSlider.value = current;
}
void OnDestroy()
{
hpManager.OnHPChanged -= UpdateHPUI;
}
}
HP 슬라이더에 붙일 HPUIController.cs 스크립트입니다.
using System;
using UnityEngine;
public class HPManager : MonoBehaviour
{
public int maxHP;
public int currentHP;
public event Action<int, int> OnHPChanged; // current, max
public void SetMaxHP(int newMaxHP)
{
maxHP = newMaxHP;
currentHP = maxHP;
OnHPChanged?.Invoke(currentHP, maxHP);
}
public void TakeDamage(int damage)
{
currentHP = Mathf.Max(currentHP-damage,0);
OnHPChanged?.Invoke(currentHP, maxHP);
}
public void Heal(int amount)
{
currentHP = Mathf.Min(currentHP+amount, maxHP);
OnHPChanged?.Invoke(currentHP, maxHP);
}
public bool IsDead()
{
return currentHP <= 0;
}
}
체력이 존재하여 체력바를 달고 다니는 게임오브젝트(캐릭터)에 붙일 HPManager.cs 스크립트입니다.
maxHP, currentHP는 인스펙터나 다른 스크립트에서 초기화를 시켜주셔야 합니다. 그렇지 않으면 둘다 0으로 시작하겠죠.
전체적인 체력바 시스템의 기본 구조는 위와 같습니다.
대충 골격은 이러하다는 뜻입니다.
이제 다른 전투 스크립트에서 공격을 받았을 때 TakeDamage(10); 이런 식으로 호출해주시면 됩니다.
그 코드들도 공개하고 싶은데 여건이 되지 않네요. 다음에 기회가 되면 보여드리도록 하겠습니다.
읽어주셔서 감사합니다.