게임을 만드는데 캐릭터 머리 위에 이름이나 HP, MP를 나타내야 할 때가 있다. 위의 HP Bar를 구현하기 위해서 추가하고자 하는 GameObject에 HP Bar에 대한 Script Component를 추가해야 한다.
UI를 사용하면 거리가 먼 상황일 때 고정크기의 UI가 여러개 존재하기 때문에 원근법을 위한 추가적인 조치가 필요하다. 하지만, 3D Object를 사용하면 거리가 멀 때 크기가 작은 상태를 유지할 수 있다.
HP Bar를 구현하는데 3D Object의 Slider를 사용한다. Slider의 Header와 BackGround Color를 빨간색으로 설정해 HP를 표현할 수 있다.
체력값은 Slider의 Value 속성으로 조절할 수 있다.
HP Bar를 추가하고자 하는 GameObject에 HP Bar(3D Object)를 추가한다.
GameObject go = Managers.Resource.Instantiate($"UI/WorldSpace/{name}");
if (parent != null)
go.transform.SetParent(parent);
Canvas canvas = go.GetComponent<Canvas>();
canvas.renderMode = RenderMode.WorldSpace;
canvas.worldCamera = Camera.main;
return Util.GetOrAddComponent<T>(go);
HP Bar의 위치조정을 위해 HP Bar의 Update에 부모 GameObject의 Collider y크기만큼 위로 조정한다.
private void Update()
{
Transform parent = transform.parent;
transform.position = parent.position + Vector3.up * (parent.GetComponent<Collider>().bounds.size.y);
transform.rotation = Camera.main.transform.rotation;
float ratio = _stat.Hp / (float)_stat.MaxHp;
SetHpRatio(ratio);
}
public void SetHpRatio(float ratio)
{
GetObject((int)GameObjects.HPBar).GetComponent<Slider>().value = ratio;
}
HP가 감소하는 기능은 발생하는 이벤트에서 Slider가 붙은 GameObject의 HP Value를 줄이는 방식으로 구현한다.
Stat targetStat = _lockTarget.GetComponent<Stat>();
PlayerStat myStat = gameObject.GetComponent<PlayerStat>();
int damage = Mathf.Max(0, myStat.Attack - targetStat.Defense);
targetStat.Hp -= damage;