[Unity] 체력 게이지(HP Bar)

이정석·2023년 7월 21일
0

Unity

목록 보기
16/22

HP Bar

게임을 만드는데 캐릭터 머리 위에 이름이나 HP, MP를 나타내야 할 때가 있다. 위의 HP Bar를 구현하기 위해서 추가하고자 하는 GameObject에 HP Bar에 대한 Script Component를 추가해야 한다.

HP Bar를 UI가 아닌 3D Object를 사용한다.

UI를 사용하면 거리가 먼 상황일 때 고정크기의 UI가 여러개 존재하기 때문에 원근법을 위한 추가적인 조치가 필요하다. 하지만, 3D Object를 사용하면 거리가 멀 때 크기가 작은 상태를 유지할 수 있다.

HP Bar를 구현하는데 3D Object의 Slider를 사용한다. Slider의 Header와 BackGround Color를 빨간색으로 설정해 HP를 표현할 수 있다.

체력값은 Slider의 Value 속성으로 조절할 수 있다.

1. 생성

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;
    }

2. 체력 감소

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;
profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글