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

게임개발 중급(42) - Monster Killer(4)

by jyppro 2023. 6. 3.

Monster Killer(4)

저번엔 HP바를 만드는 법과 데미지를 적용시키는 법에 대해서 다루었습니다. 이번엔 레벨디자인 관련해서 이야기 해볼까 했는데, 그 전에 데미지가 어떻게 들어가는지 플레이어가 확인할 수 있도록 Text UI를 만들고, 몬스터가 죽으면 죽는 애니메이션이 나오도록 설정하는 것부터 해보도록 하겠습니다.

 

현재체력과 최대체력 UI

유저의 데미지를 보여주는 방법에는 여러 방법이 있지만, 저는 밤송이를 맞췄을 때, 깎이는 데미지를 현재 데미지로 표현하여 보여주는 방식으로 하겠습니다. 몬스터의 현재체력과 최대체력을 체력바 위에 보여주면 됩니다.

 

TextMeshPro

유니티 최근 버전부터는 Text가 레거시로 들어가고 TextMeshPro가 대신 사용되는 것 같습니다. 사용법은 Text와 크게 다르지 않지만, 약간 다른점은 있습니다. 우선 이것을 생성해주고 텍스트를 100 / 100으로 설정해줍니다. 유저에게 글씨가 잘 보이도록 하기위해 검은색으로 중앙정렬시켜줍니다.

체력바-텍스트
체력바 텍스트 설정

이제 스크립트로 체력이 깎이는 것을 연결시켜주어야 합니다. 기존에 체력바를 담당하던 HPbar 스크립트는 삭제하고 MonsterController 스크립트를 새로 만들겠습니다.

 

MonsterController

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

public class MonsterController : MonoBehaviour
{
    public float maxHealth = 100f; // 최대 체력
    public float currentHealth = 100f; // 현재 체력
    public Slider healthSlider; // 체력바 슬라이더 컴포넌트
    public TextMeshProUGUI textHP; //체력바 텍스트

    void Start()
    {
        UpdateHealthSlider();
    }

    public void TakeDamage(int damage)
    {
        currentHealth -= damage;
        UpdateHealthSlider();
    }

    public void UpdateHealthSlider()
    {
        float decreaseHp = (float)currentHealth / (float)maxHealth;
        // 체력바 슬라이더의 값을 현재 체력 비율로 설정
        healthSlider.value = decreaseHp;
        textHP.text = $"{currentHealth} / {maxHealth}";
    }
}

몬스터의 현재,최대체력을 가지고 데미지를 받으면 현재체력이 깎이고 게임에 적용되도록 만들었습니다. 여기서 TextMeshPro의 다른점이 몇가지 있는데, using문을 이용해 처음에 TMPro를 사용해주어야 하며, 텍스트 컴포넌트에 접근하려면 TextMeshProUGUI로 선언해서 가져와야 합니다. 이제 게임을 실행해 작동을 테스트 해보겠습니다.

 

데미지-적용-테스트
데미지 적용

잘 적용되는 모습을 볼 수 있습니다.

 

애니메이션 적용

이제 애니메이션에 대해 다뤄볼텐데, 저희가 가져온 몬스터 에셋에는 기존 애니메이션이 존재합니다. 이것을 확인하려면 애니메이션 컨트롤러를 열어보면 됩니다.

애니메이터
애니메이터 컴포넌트

이렇게 이미 컨트롤러가 존재하며, 컴포넌트 설정도 프리팹안에 되어있습니다. 이것을 열어보면

애니메이션-트리
애니메이션 트리

이렇게 각각의 행동에 대한 트리가 존재합니다. 원래는 위 그림의 모양이 아니지만, 저는 죽는 모션만 사용하기 위해 전부 분리해 놓았습니다. 애니메이터에 대해 간략히 설명드리면, Entry부터 시작하여 트랜잭션(화살표)을 통해 다음 모션으로 이어지도록 만들어 줄 수 있는 유용한 도구입니다. 각각 조건을 설정할 수 있고, 조건에 따라 특정 행동을 하도록 만들어 줄 수 있습니다. 위 그림과 같이 저는 Idle에서 조건을 부여한 트랜잭션을 통해 Die모션으로 이어지도록 했습니다.

 

애니메이터에서 파라미터를 통해 bool타입의 Death를 만들고, true일때 Die모션으로 이어지도록 조건을 설정했습니다. 조건설정은 트랜잭션(화살표)를 누르면 Condition의 +를 눌러 만들어 줄 수 있습니다.

 

MonsterController(애니메이터 추가)

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

public class MonsterController : MonoBehaviour
{
    public float maxHealth = 100f; // 최대 체력
    public float currentHealth = 100f; // 현재 체력
    public Slider healthSlider; // 체력바 슬라이더 컴포넌트
    public TextMeshProUGUI textHP; //체력바 텍스트
    private Animator animator; //애니메이션

    void Start()
    {
	animator = GetComponent<Animator>();
        UpdateHealthSlider();
    }

    public void TakeDamage(int damage)
    {
        currentHealth -= damage;
	if (currentHealth <= 0f)
        {
		animator.SetBool("Death", true);
	}
	UpdateHealthSlider();
    }

    public void UpdateHealthSlider()
    {
        float decreaseHp = (float)currentHealth / (float)maxHealth;
        // 체력바 슬라이더의 값을 현재 체력 비율로 설정
        healthSlider.value = decreaseHp;
        textHP.text = $"{currentHealth} / {maxHealth}";
    }
}

스크립트도 추가해 줍니다. 체력이 0이되면 Death를 true로 만들어 줍니다. 이렇게 하고 실행해보면

 

죽는-애니메이션
죽는 애니메이션

체력이 0이되면 죽는 애니메이션이 실행되는 것을 확인할 수 있습니다.

 

<NEXT>

오늘은 체력바에 텍스트로 현재,최대체력 표시와 애니메이션 컨트롤러를 통한 애니메이션 조작에 대해 다루었습니다. 다음에는 레벨디자인에 대해 이야기 해보겠습니다. 감사합니다.