플레이어 스탯 HUD 표시 시스템
목차
1. 시스템 요구 사항
게임 플레이 중 플레이어는 자신의 현재 상태를 즉시 파악할 수 있어야 한다.
특히 체력(HP)과 배터리(BT)는 플레이의 생존과 행동 지속 여부에 직접적인 영향을 주는 핵심 자원이기 때문에, 플레이 도중 항상 화면에 표시되어야 한다.
따라서 HUD에서는 플레이어의 현재 체력과 배터리 상태를 실시간으로 시각적으로 표현해야 하며, 동시에 숫자 형태로도 정보를 제공하여 정확한 수치를 확인할 수 있어야 한다.
또한 게임에서 사용되는 재화인 코인 역시 HUD를 통해 항상 확인할 수 있어야 하며, 코인이 획득되거나 소비될 때 즉시 화면에 반영되어야 한다.
이 시스템은 StatusManager가 관리하는 실제 플레이어 스탯 데이터를 참조하여 HUD UI에 반영하는 역할을 수행하며, 게임이 진행되는 동안 지속적으로 UI 상태를 업데이트하는 구조로 설계되었다.
2. 설계 목표
- 플레이어 체력과 배터리를 HUD에서 항상 확인할 수 있도록 구성
- 코인 획득 및 소비 시 HUD에 즉시 반영
3. 흐름도
[게임 시작]
↓
HUD_StatusManager 초기화
(Singleton 생성)
↓
StatusManager 참조
↓
HUD UI 컴포넌트 로드
↓
Update 루프
↓
┌────────────┐
체력 HUD 업데이트
hpBar.fillAmount 계산
HP 텍스트 갱신
└────────────┘
↓
┌──────────────┐
배터리 HUD 업데이트
batteryBar.fillAmount
BT 텍스트 갱신
└──────────────┘
↓
코인 획득 / 소비 이벤트 발생
↓
코인 텍스트 업데이트
이 시스템은 StatusManager가 관리하는 실제 플레이어 데이터를 HUD에 반영하는 UI 레이어 역할을 수행한다.
즉, 스탯 계산과 게임 로직은 StatusManager에서 담당하고, HUD_StatusManager는 이를 시각적으로 표시하는 역할만 수행하는 구조로 분리되어 있다.
4. 구현
4.1. HUD 싱글톤 구조
public static HUD_StatusManager instance;
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else Destroy(gameObject);
}HUD 시스템은 게임 전반에서 항상 접근할 수 있어야 하기 때문에 싱글톤 패턴으로 구성하였다.
instance 변수를 통해 다른 스크립트에서도 HUD에 접근할 수 있도록 설계하였다.
DontDestroyOnLoad를 사용하여 씬이 전환되더라도 HUD 객체가 유지되도록 하였다.
이를 통해 게임 전체에서 동일한 HUD 시스템을 유지할 수 있으며, 씬 전환 시 HUD를 다시 생성하거나 초기화할 필요가 없도록 설계하였다.
이 방식은 전역 UI 시스템이나 게임 매니저에서 자주 사용되는 구조이며, HUD가 항상 존재해야 하는 시스템에 적합한 패턴이다.
4.2. StatusManager 데이터 참조
private void Start()
{
LoadResource();
}
void LoadResource()
{
statusManager = StatusManager.instance;
hpTxt = GameObject.Find("HpLabel").GetComponent<UILabel>();
batteryTxt = GameObject.Find("BtLabel").GetComponent<UILabel>();
}HUD 시스템은 플레이어 상태 데이터를 직접 계산하지 않고 StatusManager에서 관리하는 데이터를 참조하도록 설계하였다.
StatusManager.instance를 통해 현재 플레이어 상태 관리 객체를 가져오고, 이를 기반으로 체력과 배터리 값을 HUD에 표시한다.
이 구조는 게임 로직과 UI 표현을 분리하는 설계 방식으로, 시스템 간 결합도를 낮추는 장점이 있다.
UI 컴포넌트는 GameObject.Find를 통해 씬에서 직접 찾아와 참조한다.
이후 해당 객체에서 UILabel 컴포넌트를 가져와 HUD 텍스트를 갱신하는 데 사용한다.
이 로직을 Awake가 아닌 Start에서 실행한 이유는 씬의 UI 객체가 모두 생성된 이후에 안전하게 참조를 가져오기 위함이다.
Unity에서 Awake는 오브젝트 생성 직후 호출되기 때문에 다른 UI 객체의 초기화 순서에 따라 참조가 실패할 가능성이 있다.
반면 Start는 모든 Awake가 실행된 이후 호출되므로 씬에 존재하는 UI 객체를 안정적으로 찾을 수 있다.
따라서 UI 컴포넌트 참조 초기화는 Start 단계에서 수행하도록 설계하였다.
4.3. 체력 & 배터리 HUD 게이지 업데이트
private void Update()
{
HpBarManage();
BtBarManage();
}
void HpBarManage()
{
hpBar.fillAmount = statusManager.CurrentHp / statusManager.MaxHp;
int hp = (int)statusManager.CurrentHp;
hpTxt.text = hp.ToString() + " / " + statusManager.MaxHp.ToString();
}
void BtBarManage()
{
batteryBar.fillAmount = statusManager.CurrentBt / statusManager.MaxBt;
int battery = (int)statusManager.CurrentBt;
batteryTxt.text = battery.ToString() + " / " + statusManager.MaxBt.ToString();
}체력과 배터리는 HUD에 게이지 형태와 숫자 형태를 동시에 사용하여 플레이어가 현재 상태를 직관적으로 파악할 수 있도록 구현하였다.
게이지는 NGUI의 UISprite.fillAmount를 이용하여 구현하였다.
fillAmount 값은 0~1 범위의 값으로 스프라이트가 채워지는 비율을 의미한다.
따라서 현재 스탯 값을 최대 스탯 값으로 나누어 정규화된 값을 계산하면 게이지가 현재 스탯 비율에 맞게 채워지도록 표현할 수 있다.
이 방식은 진행도 표시 UI에서 흔히 사용되는 방식이며, 수치 데이터를 직관적인 시각 정보로 변환할 수 있다는 장점이 있다.
또한 스탯 값은 숫자 형태로도 표시하여 플레이어가 정확한 수치를 확인할 수 있도록 하였다.
이때 Current 값은 float이기 때문에 (int) 캐스팅을 사용하여 소수점을 제거한 정수 형태로 표시하도록 구현하였다.
이 로직을 Update에서 실행한 이유는 체력과 배터리 값이 다양한 게임 시스템에서 실시간으로 변경되기 때문이다.
예를 들어 배터리는 이동 중 지속적으로 감소하며, 체력은 몬스터 공격, 배터리 소모, 특정 맵 진입 등 여러 게임 로직에 의해 수시로 변경된다.
이러한 값 변화는 특정 이벤트 하나로 묶기 어렵기 때문에, 매 프레임 현재 값을 확인하여 HUD에 반영하는 방식이 안정적이다.
따라서 체력과 배터리 UI는 Update 루프에서 지속적으로 값을 확인하고 갱신하도록 설계하였다.
이를 통해 어떤 시스템에서 값이 변경되더라도 HUD에 항상 최신 상태가 반영되도록 구현하였다.
4.4. 코인 시스템 HUD 표시
public void GetCoin(int n)
{
coin += n;
UpdateCoin();
}
public void SpendCoin(int n)
{
coin -= n;
UpdateCoin();
}
void UpdateCoin()
{
coinText.text = coin + "";
}코인은 게임 플레이에서 아이템 구매나 강화 등에 사용되는 주요 재화이기 때문에 HUD에서 항상 확인할 수 있도록 구성하였다.
코인 시스템은 체력이나 배터리와 달리 값이 변하는 시점이 명확하게 정의된 데이터이다.
예를 들어 몬스터 처치 보상, 아이템 구매, 퀘스트 보상 등 특정 이벤트가 발생했을 때만 값이 변경된다.
따라서 코인 HUD는 Update 루프에서 지속적으로 값을 확인하는 방식이 아니라, 값이 변경되는 시점에서만 UI를 갱신하는 이벤트 기반 구조로 설계하였다.
코인을 획득할 때는 GetCoin 함수를 호출하여 코인을 증가시키고, 코인을 사용할 때는 SpendCoin 함수를 호출하여 코인을 감소시킨다.
두 함수 모두 내부에서 UpdateCoin을 호출하여 HUD에 표시되는 코인 값을 즉시 갱신하도록 구현하였다.
이 방식은 매 프레임 UI를 갱신하는 방식보다 불필요한 연산을 줄일 수 있으며, 데이터 변경 시점과 UI 갱신 시점이 명확하게 연결되는 장점이 있다.
즉, 이 시스템에서는 실시간으로 지속 변화하는 스탯(HP, BT)은 Update 기반으로 관리하고, 이벤트 기반으로 변화하는 데이터(코인)는 함수 호출 기반으로 관리하는 구조를 사용하였다.
5. 개발 의도
HUD_StatusManager는 플레이어의 상태 정보를 게임 화면에 지속적으로 표시하는 UI 관리 시스템이다.
이 시스템은 플레이어 스탯 계산을 담당하는 StatusManager와 역할을 분리하여 설계되었다.
StatusManager는 플레이어의 실제 체력, 배터리, 스탯 계산 등 게임 로직을 담당하고, HUD_StatusManager는 이러한 데이터를 시각적으로 표현하는 UI 레이어 역할을 수행한다.
이러한 구조는 게임 로직과 UI 표현을 분리하는 설계 방식으로, 시스템의 유지보수성과 확장성을 높이는 데 도움이 된다.
또한 HUD 시스템은 게임 전반에서 항상 접근해야 하는 기능이기 때문에 싱글톤 패턴을 사용하여 전역적으로 접근 가능하도록 구성하였다.
이를 통해 다른 시스템에서도 HUD에 쉽게 접근할 수 있으며, 코인 획득이나 UI 이벤트 발생 시 HUD를 즉시 업데이트할 수 있도록 설계하였다.
체력과 배터리 표현에는 NGUI의 UISprite.fillAmount를 사용하여 게이지 형태의 시각적 표현을 구현하였다.
이 방식은 수치 데이터를 직관적인 시각 정보로 변환할 수 있어 플레이어가 자신의 상태를 빠르게 인식할 수 있도록 돕는다.
결과적으로 이 HUD 시스템은 게임 로직(StatusManager)과 UI 표현(HUD_StatusManager)을 분리하면서, 플레이어 상태를 실시간으로 전달하는 인터페이스 역할을 수행하도록 설계되었다.
