Unity/UI
Unity 체력 UI 만들기
sungmin08
2025. 3. 31. 23:05
Unity에서 Slider을 통해 캐릭터 체력을 만들어보자.
※본 글에서는 몬스터나 캐릭터 위에 뜨는 HP 체력바가 아닌 배틀그라운드 같은 게임처럼 특정 지점에 존재하는 체력 바를 구현할 것다.
1. 먼저 Slider 오브젝트를 추가해주자
2. 다음으로 Handle은 필요없으므로 지워주도록 하자.
속성명 | 설명 |
Interactable | 슬라이더를 사용자가 조작할 수 있는지 여부 설정 |
Transition | 슬라이더 핸들에 적용할 전환 방식 (ex.Color, Tint, Animation 등) |
Target Graphic | 전환 효과를 적용할 UI 그래픽 (Handle 이미지) |
Color 설정들 | Normal, Highlighted, Pressed, Selected, Disabled 색상 설정 |
Color Multiplier | 전환 색상의 강도 조절 |
Fade Duration | 색상 전환이 완료되기까지의 시간 |
Navigation | 키보드/컨트롤러 방향 이동 설정 방식 (예: 자동, 수동 등) |
Fill Rect | 슬라이더 채워지는 부분의 RectTransform 참조 |
Handle Rect | 사용자가 드래그하는 핸들의 RectTransform 참조 |
Direction | 슬라이더가 이동하는 방향 (예: Left To Right, Bottom To Top 등) |
Min Value | 슬라이더의 최소값 |
Max Value | 슬라이더의 최대값 |
Whole Numbers | 값이 정수만 가능하도록 설정 (체크하면 소수점 안 됨) |
Value | 현재 슬라이더의 값 |
On Value Changed | 값이 변경될 때 호출되는 이벤트 리스너 |
위 표는 Slider 컴포넌트의 속성들이다. 진하게 칠한 부분은 우리가 자주 쓰는 속성이니 숙지하고 넘어가자.
3. 다음으로 HP의 색은 Fill 오브젝트에서 바꿔주면된다.
여기서 질문이 있을 수 있는데 Value 값을 0과 1일 때 체력바가 꽉 차거나 줄지 않아요
더보기

Value 값을 0인데도 체력이 조금 남아있는 것처럼 보인다. 이 현상은 Fill의 Transform을 만져 간단하게 해결할 수 있다.

Fill에서 Width가 기존에는 10일텐데 이걸 0으로 바꿔주면 된다.

Fill Area의 Transform도 모두 0으로 바꿔주자



4. 기본적인 세팅은 끝났다. 이제 코드를 사용하여 HP를 조절해보자.
using UnityEngine;
using UnityEngine.UI;
public class PlayerHP : MonoBehaviour
{
// 싱글톤 구현
public static PlayerHP instance;
public Slider hpSlider;
private int maxHP = 100;
private int currentHP=100;
float hp;
private void Awake()
{
if (instance == null)
{
instance = this;
}
else
{
Destroy(gameObject);
}
}
private void Start()
{
//hpSlider의 value 값 = 현재 체력 / 최대 체력
hpSlider.value=(float)currentHP / (float)maxHP;
}
private void Update()
{
if(currentHP<=0)
{
GameOver();
}
HandleHP();
}
//플레이어의 체력이 깎였을 때 함수 (외부에서 사용하기 위해서 public 함수)
public void TakeDamage(int damage)
{
if(currentHP>0)
{
currentHP -= damage;
}
}
public void HealHP(int heal)
{
currentHP += heal;
if (currentHP > maxHP)
{
currentHP = maxHP;
}
}
//선형보간 Math.Lerp를 사용하여 피가 천천히 깎일 수 있도록 함
void HandleHP()
{
hp = (float)currentHP / (float)maxHP;
hpSlider.value = Mathf.Lerp(hpSlider.value, hp, Time.deltaTime * 5f);
}
private void GameOver()
{
GameManager.instance.EndGame();
Debug.Log("Game Over!");
}
}
5. 다음 코드를 플레이어에게 집어넣고 아까 만든 HPBar를 넣어주면 끝이다.
이제 특정 조건에서 플레이어의 체력을 깎고 싶다면 해당 코드에 한줄만 적어주면 끝이다.
PlayerHp.instance.TakeDamage(체력깎인정도)