오늘 게임의 HUD 작업을 했는데, 타이머, 레벨, HP, 경험치(Exp), 그리고 킬 수를 각각 UI에 표시할 수 있게 만들었다. LateUpdate를 사용해서 게임 상태에 따라 각 UI 요소들이 실시간으로 갱신되도록 설정했고, TextMeshProUGUI와 Slider를 활용해서 텍스트와 슬라이더의 값을 적절히 표현할 수 있도록 했다.
경험치(Exp)는 현재 경험치와 다음 레벨에 필요한 경험치를 비교해서 슬라이더로 보여줬다.
레벨은 단순히 "Lv.00" 형식으로 텍스트에 표시했다.
킬 수는 "00" 형식으로 보여줬고, 타이머는 남은 시간을 분과 초로 계산해 "00:00" 형식으로 텍스트로 출력했다.
HP는 현재 체력과 최대 체력을 비교해 슬라이더로 표시하는 방식으로 만들었다.
UI 작업을 마치고 나니 게임 플레이 중 정보 전달이 훨씬 명확해진 것 같다.
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class HUD : MonoBehaviour
{
public enum InfoType { Exp, Level, Kill, Time, Health}
public InfoType type;
TextMeshProUGUI myText;
Slider mySlider;
private void Awake()
{
mySlider = GetComponent<Slider>();
myText = GetComponent<TextMeshProUGUI>();
}
private void LateUpdate()
{
switch (type)
{
case InfoType.Exp:
float curExp = GameManager.Instance.exp;
float maxExp = GameManager.Instance.nextExp[GameManager.Instance.level];
mySlider.value = curExp / maxExp;
break;
case InfoType.Level:
myText.text = string.Format("Lv.{0:F0}", GameManager.Instance.level);
break;
case InfoType.Kill:
myText.text = string.Format("{0:F0}", GameManager.Instance.kill);
break;
case InfoType.Time:
float remainTime = GameManager.Instance.maxGameTime - GameManager.Instance.gameTime;
int min = Mathf.FloorToInt(remainTime / 60);
int sec = Mathf.FloorToInt(remainTime % 60);
myText.text = string.Format("{0:D2}:{1:D2}", min, sec);
break;
case InfoType.Health:
float curHealth = GameManager.Instance.health;
float maxHealth = GameManager.Instance.maxHealth;
mySlider.value = curHealth / maxHealth;
break;
}
}
}

