[Unity] Slider로 체력바 구현하기

김가은·2026년 1월 21일

Unity

목록 보기
10/10

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


UI 설정


먼저 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 스크립트입니다.

  • hpManager.OnHPChanged += UpdateHPUI;
    • HPManager에서 체력이 바뀌었음을 알려주면, UpdateHPUI()을 실행하도록 이벤트를 구독합니다.
  • void ODestroy()
    • hpManager.OnHPChanged -= UpdateHPUI;
      • 파괴된 경우 이벤트 구독을 해제하도록 합니다.

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으로 시작하겠죠.

  • public void SetMaxHP(int newMaxHP)
    • 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);
      • 체력을 아무리 회복해도 maxHP을 못 넘게 합니다.
    • OnHPChanged?.Invoke(currentHP, maxHP);
      • 체력이 바뀌었음을 알립니다.

전체적인 체력바 시스템의 기본 구조는 위와 같습니다.
대충 골격은 이러하다는 뜻입니다.

이제 다른 전투 스크립트에서 공격을 받았을 때 TakeDamage(10); 이런 식으로 호출해주시면 됩니다.

그 코드들도 공개하고 싶은데 여건이 되지 않네요. 다음에 기회가 되면 보여드리도록 하겠습니다.

읽어주셔서 감사합니다.

0개의 댓글