Unity

[TIL] Unity 최종프로젝트 몬스터 HP바 만들기

unihee1 2025. 4. 16. 20:23

2025.04.11 - [Unity] - [TIL] Unity 최종프로젝트 몬스터 AI 구현하기(오브젝트풀)_ 4일차

 

[TIL] Unity 최종프로젝트 몬스터 AI 구현하기(오브젝트풀)_ 4일차

2025.04.10 - [Unity] - [TIL] Unity 최종프로젝트 몬스터 AI 구현하기_ 3일차 [TIL] Unity 최종프로젝트 몬스터 AI 구현하기_ 3일차2025.04.09 - [Unity] - [TIL] Unity 최종프로젝트 몬스터 AI 구현하기(FSM)_ 2일차 [TIL]

unihee1.tistory.com

이 게시물의 영상을 보면 몬스터의 HP가 깎을 때마다 UI에 반영되어 줄어드는 것을 볼 수 있다.

오늘은 HP UI를 만들고 만든 UI가 회전되지 않도록 스크립트를 수정하는 내용을 다룰 것이다.

 

1. HP바 UI 만들기

하이어라키 창 -> UI -> Image를 눌러 HP바의 배경과 실제로 줄어드는 이미지를 두개 생성하고 프로젝트 창에서 스프라이트를 만들어 준다.

만든 스프라이트를 실제로 줄어드는 HP바 이미지의 Source Image에 넣어주고 이미지 타입을 Filled로 바꿔준다.

캔버스의 RenderMode 를 World Space로 만들고 만들어진 캔버스를 몬스터 오브젝트의 하위에 새로 만든 빈 오브젝트에 넣어준다.

하위에 넣은 후 UI가 몬스터의 머리 위에 있도록 적당한 크기와 위치를 조절해주면 끝이다.

 

2. MonsterHPUI 스크립트 생성

using UnityEngine;
using UnityEngine.UI;

public class MonsterHPUI : MonoBehaviour
{
    [SerializeField] private Image hpBar;

    [SerializeField] private MonsterController monster;
    [SerializeField] private Camera mainCam;

    void Start()
    {
        if (mainCam == null)
        {
            mainCam = Camera.main;
        }
        if (monster == null)
        {
            Debug.Log("없어");
        }
        UpdateHP(monster.Data.monsterHP);
    }
    void Update()
    {
        if (mainCam != null)
        {
            Vector3 dir = transform.position - mainCam.transform.position;

            transform.rotation = Quaternion.LookRotation(dir);
        }
    }

    public void UpdateHP(float currentHP)
    {

        float fill = Mathf.Clamp01(currentHP / monster.Data.maxHP);
        hpBar.fillAmount = fill;
    }
}

몬스터가 회전해도 UI는 회전하지 않도록하며 HP의 비율을 UI에 반영시키는 역할을 한다.

 

void Update()
{
    if (mainCam != null)
    {
        Vector3 dir = transform.position - mainCam.transform.position;
        transform.rotation = Quaternion.LookRotation(dir);
    }
}
  • 매 프레임마다 HP UI가 카메라 방향을 바라보도록 회전한다.
  • dir은 카메라에서 HP바를 향하는 벡터이다.
  • LookRotation(dir)을 통해 해당 방향을 정면으로 설정한다.
public void UpdateHP(float currentHP)
{
    float fill = Mathf.Clamp01(currentHP / monster.Data.maxHP);
    hpBar.fillAmount = fill;
}
  • 몬스터의 체력을 최대 체력으로 나눈 비율을 구한다.
  • Mathf.Clamp01은 값이 0~1 사이로 고정되도록 한다.
  • Image.fillAmount에 그 비율을 설정해서 UI에 반영한다.

 

3. 실행해보기

- 수정 후

 

- 수정 전

수정 전은 UI가 회전하는 것이 보인다.