- 체력바
Entity의 체력바를 만들어보자
먼저 UI > Image로 Image를 생성하자.
Image를 생성하면 자동으로 Canvas를 생성한다.
UI에서 렌더링의 순서는 Canvas의 자식오브젝트의 순서이다.
즉 자식 오브젝트가 위에있을수록 뒤쪽에 그려진다.
또한 부모보다 자식 오브젝트가 더 먼저 그려진다.
(그냥 위에있으면 더 먼저 그려진다 생각하면 된다)

먼저 Canvas의 설정을 밑의 그림처럼 설정하자.


여기서 빨간색으로 줄어들 bar의 Image에서 Source Image를 넣어주고, Image Type을 Filled로, Fill Method를 Horizontal로 설정해준다.

이제 스크립트를 넣어주겠다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 1)
public class HpBarUI : MonoBehaviour
{
public Image bar;
private Enemy targetEnemy; // 2)
public void Init(Enemy target) // 3)
{
targetEnemy = target;
}
private void Update()
{
if(targetEnemy == null)
{
Destroy(gameObject);
return;
}
bar.fillAmount = targetEnemy.curHp / targetEnemy.maxHp; // 4)
transform.position = Camera.main.WorldToScreenPoint(targetEnemy.transform.position + Vector3.down); // 5)
}
}
// * Enemy스크립트에서 curHp의 private를 public으로 바꾸었다.
UI요소 스크립트에 접근하기 위한 using문이다.
hp와 포지션을 받을 Enemy이다. 체력바를 프리펩화해서 소환할때 초기화할것이다.
초기화할때 사용할 함수이다.
이미지의 fillamount는 이미지가 얼마나 표시되게할지의 비율이다.
0은 숨겨지고 0.5는 절반, 1은 전체가 표시된다.
curHp는 maxHp를 넘지 않으므로 curHp / maxHp의 범위는 0.0 ~ 1.0이 된다.
체력바의 위치를 정한다. WorldToScreenPoint는 월드상의 위치를 Canvas상의 위치로 변환시켜준다.
Inspector 창에서 빨간색 bar를 끌어다 놓는다.
마지막으로 HpBar를 Project창으로 끌어다 놓아서 프리펩화 시킨 후 Hierarchy 창에 있는 HpBar는 삭제해준다.
이제 Enemy 스크립트를 수정하겠다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public GameObject hpBarPrefeb;
public float maxHp;
public float curHp;
public void Damage(float amount)
{
curHp -= amount;
}
private void Awake()
{
curHp = maxHp;
Instantiate(hpBarPrefeb, GameObject.Find("Canvas").transform)
.GetComponent<HpBarUI>().Init(this); //1
}
private void Update()
{
if(curHp <= 0) Destroy(gameObject);
}
}
