1 분 소요

Intro

이번 포스팅에서는 몬스터의 Hp바를 구현하고, 몬스터의 로직을 일부 수정했습니다.

몬스터의 Hp바는 개별 몬스터 위쪽에 배치하여 몬스터가 움직일때 같이 움직이도록 했습니다.

image

몬스터 Hp바

몬스터의 Hp바는 UI입니다. 따라서 몬스터마다 Canvas를 추가하고, Canvas의 렌더모드는 “World Space”로 하여

우리가 보는 스크린상에서 3D 오브젝트처럼 동작하도록 했습니다.

먼저, 몬스터 자식 오브젝트로 빈 게임오브젝트를 추가하고 아래에 Hp바 UI를 추가해주었습니다.

image

image


그런다음, Canvas에 MonsterHealthBar 스크립트를 추가해주었습니다.

public class MonsterHealthBar : MonoBehaviour
{
    [SerializeField] private Slider slider;                 // 체력바 슬라이더

    private Monster monster;                                
    private Transform cam;                                  // 메인 카메라 Transform

    private void Start()
    {
        cam = Camera.main.transform;
        monster = GetComponentInParent<Monster>();

        SetHpAmount();
    }

    private void Update()
    {
        // UI가 카메라를 정면으로 바라보도록
        transform.LookAt(transform.position + cam.rotation * Vector3.forward, cam.rotation * Vector3.up);
        SetHpAmount();
    }

    // 현재 체력 표시
    private void SetHpAmount()
    {
        float hpFillAmount = (float)monster.curHp / monster.maxHp;
        slider.value = hpFillAmount;
    }
}
  • 몬스터의 정보를 가져와 현재 체력을 표시하도록 했습니다.

  • 체력바 UI가 카메라를 향하게하여 플레이하는동안 체력바가 어색해보이지않도록 했습니다.

몬스터 탐지로직

몬스터는 플레이어가 가까이오면 이를 감지하여 현재상태를 “Chase” 상태로 변경하고, 플레이어를 쫓도록하는것을 BoxCollider를 사용하여 구현하였습니다.

하지만 “Chase” 상태에서 플레이어가 멀어져 원래자리로 복귀하는 부분과 OnTriggerEnter()가 발생하는 콜라이더의 가장자리 부분에서

“Idle” <-> “Chase” 로의 상태전환이 모호하게 발생하여

플레이어가 탐지범위에 들어왔음에도 가끔씩 동작하지 않는 문제가 발생하여 다음과같이 변경하였습니다.

  • OnTriggerEnter() 로 ‘한번’ 탐지하던것을 OnTriggerStay() 로 변경하였습니다.
    • 또한 플레이어의 현재상태가 “Idle” 일때만 탐지하도록 했습니다.
public class TurtleShellRange : MonoBehaviour
{
    [SerializeField] private SphereCollider scanRange;              // 적 탐지 범위
    [SerializeField] private  TurtleShell parent;

    // Scan Range에 플레이어가 들어왔을경우 Chase 상태 돌입
    private void OnTriggerStay(Collider other)
    {
        if (!other.CompareTag("Player"))
            return;

        if(parent.curState == TurtleShell.States.Idle)
            parent.ChangeState(TurtleShell.States.Chase);
    }
}

댓글남기기