1 분 소요

Intro

이번 포스팅에서는 몬스터의 죽음상태를 구현해보았습니다.

몬스터는 어떤 상태에서든 공격을받아 체력이 0이하가되면 죽도록하였습니다.

몬스터가 죽으면 플레이어가 몬스터를 통과할수있도록 즉시 Collider를 비활성화시키고, 잠시뒤 몬스터를 비활성화시켜 씬에서 사라지도록했습니다.


먼저, 애니메이터에 “Die” 애니메이션을 추가한뒤, 파라미터로 “Die” 트리거를 만들었습니다.

image

Monster

Monster 클래스에 몬스터가 죽었는지 확인할 변수를 만들었습니다.

그리고 몬스터오브젝트를 비활성화 시킬 함수도 추가하였습니다.

public bool isDead;         // 죽었는지 여부

public void DeactiveGameObject()
{
    gameObject.SetActive(false);
}


TurtleShell

TurtleShell 클래스에 죽음에 관한 조건을 추가하였습니다.

그리고, Update 함수에 있는 상태전환 조건들을 한데모아 함수로빼버렸습니다.

    // 조건에따른 상태전환 결정
    private void DecideState()
    {
        // 플레이어 <-> 몬스터 거리
        float distanceToPlayer = Vector3.Distance(transform.position, Target.transform.position);
        
        // Chase상태에서 원점으로 복귀완료 -> Idle상태 톨입
        if (isReset)
        {
            ChangeState(States.Idle);
            isReset = false;
        }

        // 공격범위에 들어서면 Attack 상태 돌입
        if (distanceToPlayer <= Nav.stoppingDistance && !isDead)
        {
            ChangeState(States.Attack);
        }
        // 공격상태에서 플레이어가 멀어지면 Chase 상태 돌입
        else if (curState == States.Attack && distanceToPlayer > Nav.stoppingDistance && !isDead)
        {
            ChangeState(States.Chase);
        }

        // 체력이 0이하로 떨어지면 죽음
        if (curHp <= 0 && !isDead)
        {
            isDead = true;
            ChangeState(States.Die);
        }
    }

DieState

DieState 클래스에서는 “Die” 트리거를 발동시키고, 몬스터가 죽으면 즉시 플레이어가 몬스터를 통과할 수 있도록 히트박스 콜라이더를 비활성화시켜줍니다.

그런다음 3초뒤에 몬스터 오브젝트를 비활성화시켜 씬에서 보이지않도록했습니다.

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

/*
                Monster State - Die (죽음상태)

        - Die 애니메이션 실행

        - 히트박스 제거 => 플레이어가 몬스터 통과가능

        - 일정시간뒤 몬스터 비활성화
 */

public class DieState<T> : BaseState<T> where T : Monster
{
    public DieState(T monster) : base(monster) { }

    public override void OnStateEnter()
    {
        // 몬스터 Die 애니메이션
        monster.Anim.SetTrigger("Die");
        monster.Anim.SetBool("Walk", false);

        // 몬스터 히트박스 제거
        monster.HitBox.enabled = false;

        // 몬스터 비활성화
        monster.Invoke(nameof(monster.DeactiveGameObject), 3);
    }

    public override void OnStateUpdate()
    {
        // 현재 위치 고정
        monster.Nav.SetDestination(monster.transform.position);
    }

    public override void OnStateExit()
    {

    }
}

테스트

키입력으로 몬스터체력을 0으로만들어 동작하는지 확인해보았습니다.

image

댓글남기기