본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(41) - Monster Killer(3)

by jyppro 2023. 6. 1.

Monster Killer(3)

저번에는 카메라의 움직임과 공격 위치 그리고 머리를 기준으로 하는 데미지 적용에 대해서 알아보았습니다. 이번에는 점수 대신에 몬스터를 공격할 때 사용되는 UI를 체력바로 바꿔주는 작업을 해주겠습니다.

 

체력바 생성

체력바는 유니티 기본 UI에 있는 Slider를 통해 쉽게 만들 수 있습니다. 슬라이더를 생성하고, 열어보면 Background, Fill Area, Handle Slide Area 이렇게 세개가 보입니다. 저희는 핸들 슬라이드 에리어는 필요없으므로 삭제해주겠습니다.

Background는 체력이 깎였을 때 보이는 바를 나타내고, Fill Area는 남아있는 체력을 나타냅니다. Fill Area의 색상을 빨간색으로 변경해주겠습니다. 그리고 Transfrom을 조절하여 위치와 크기를 원하는대로 만들어 줍니다.

체력바-생성
체력바 생성

체력바 UI를 완성했습니다. 이제 스크립트를 통해 해당 체력바가 깎이도록 만들어 주어야 합니다.

 

HpBar

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HpBar : MonoBehaviour
{
    public float MaxHp = 100;
    public float currentHp = 100;
    float decreaseHp;
    // Start is called before the first frame update
    void Start()
    {
        decreaseHp = (float) currentHp / (float) MaxHp;
    }

    private void Update()
    {
        decreaseHp = (float) currentHp / (float) MaxHp;
        HandleHp();
    }

    public void HandleHp()
    {
        this.GetComponent<Slider>().value =  Mathf.Lerp(this.GetComponent<Slider>().value, decreaseHp, Time.deltaTime * 10);
    }

    public void Damage(int n)
    {
        currentHp -= n;
        if (currentHp <= 0)
        {
            currentHp = 0;
        } 
    }
}

해당 코드는 체력바를 컨트롤하는 스크립트입니다. 최대와 현재체력을 임의로 100으로 설정하고, 게임이 시작하고 나면, 계속해서 현재와 최대체력을 검사합니다. HandleHp()는 체력바가 깎이는 모습을 표현하기 위한 함수로, Mathf.Lerp를 통해 부드럽게 체력이 깎이도록 구현했습니다. 체력바가 깎이는 데미지는 이전에 설정했던 부위별 데미지인 n을 가져와 적용시켜 주었습니다.

 

이렇게 코드를 작성하여 주고, 이전에 score 관련된 모든 스크립트와 UI를 삭제시켜 줍니다.

 

BamsongiController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BamsongiController : MonoBehaviour
{
    public GameObject BamGenerator;
    public GameObject HeadPoint;
    public GameObject HPbarUI;

    public void Shoot(Vector3 dir) //인자로 3차원 벡터가 입력되고
    {
        GetComponent<Rigidbody>().AddForce(dir); // 들어온 입력벡터 만큼 오브젝트에 힘이 가해진다.
    }

    
    // Start is called before the first frame update
    void Start()
    {
        this.BamGenerator = GameObject.Find("BamsongiGenerator");
        this.HeadPoint = GameObject.Find("HeadPoint");
        this.HPbarUI = GameObject.Find("HPbar");
    }

    public void OnCollisionEnter(Collision collision) //다른 물체와 충돌하는 순간
    {
        GetComponent<Rigidbody>().isKinematic = true; //중력의 영향을 무시
        GetComponent<ParticleSystem>().Play(); // particle효과를 실행시킨다.

        Vector3 p1 = this.transform.position;
        Vector3 p2 = this.HeadPoint.transform.position;
        float d = (p1 - p2).magnitude; // 벡터의 길이 리턴
        int n = Mathf.CeilToInt(10 - d * 5);

        if(n <= 0) {n = Random.Range(1,3);}

        if (collision.gameObject.tag == "Monster") //몬스터와 충돌하는 경우 점수 상승
        {
            HPbarUI.GetComponent<HpBar>().Damage(n);
            Destroy(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

체력바의 기능은 완성하였지만, 실제로 사용이 되어야 합니다. Hpbar를 밤송이 컨트롤러에 가져와 몬스터와 충돌했을 때, 데미지 n 만큼 체력을 감소시킬 수 있도록 코드를 변경해 줍니다.

 

이렇게 작성한 뒤에 실행해보면

데미지-적용-확인
데미지 적용 확인

밤송이를 던져 몬스터를 맞췄을 때, 체력바에 데미지가 정상적으로 작동하는 모습을 확인할 수 있습니다.

 

<NEXT>

오늘은 많은 게임에서 유용하게 사용되는 HP바를 만드는 법과 데미지를 적용시키는 법에 대해서 다루었습니다. 내일은 레벨디자인 관련해서 이야기 해볼까 합니다. 해당 몬스터가 죽으면 다음 단계로 넘어갈 수 있도록 만들어 보겠습니다. 감사합니다.