[내일배움캠프] 몬스터의 자연스러운 FSM 연출하기

이준영·2025년 7월 4일

오늘은 몬스터와 플레이어의 전투를 구현 중에 다양한 문제가 발생하여서 이런 실수를 방지하기 위해서 정리해보기로 하였다.

문제점 1

몬스터가 공격 애니메이션 중에 움직여서 부자연스러움.

EnemyAttackState
  • base.Update에서는 공격 쿨타임을 체크 중이다.

  • 하지만 공격 쿨타임은 다음 공격만을 막을 뿐이고 추적 상태로 넘어가는 것을 막지 못했다.

개선점 1

몬스터의 애니메이션이 종료 후 모든 행동을 시작하는 방식으로 하였다.

EnemyAttackState
  • 애니메이션이 끝나지 않으면 어떤한 상태로 넘어가지 못하게 하였다.

문제점 2

그리고 플레이어의 정보를 받아오는데 CircleCast()를 이용했는데 이 코드는 Ray를 쏘는 주체인 자기 자신도 충돌을 포함해서 hit가 플레이어의 정보를 원할히 불러오지 못하는 문제가 있었다.

FindTarget()

개선점 2

그래서 CircleCast()를 CircleCastAll로 수정하여 모든 충돌체를 가져와 플레이어 테그를 구분하여 정보를 받아왔다.

FindTarget()

문제점 3

기획서에 공격 사정거리의 1/2가 되면 공격를 시작한다로 적혀 있어서, 그렇게 구현을 했다고 생각했다.
그래서 모든 조건을 공격 사정거리의 1/2로 설정하여 코드를 작성하였는데, 이렇게 작성하면 사실 사정거리가 공격 사정거리의 1/2로 설정되어 있는것과 같기 때문에 잘 못 구현되었다.

사실 공격 사정거리의 1/2는 추적 상태의 종료 조건이었고, 공격 자체는 공격사정거리에 있으면 시작하는 것이었다.

개선점 3

그래서 해당부분을 코드를 작성해주었다.

추적 종료 조건, 공격 조건
  • 흐름을 정리하면
  1. Idle -> Chase -> Idle -> Attack
  2. Attack -> Attack (플레이어가 아직 사정거리에 있을 때)
  3. Attack -> Chase -> Idle -> Attack (플레이어가 사정거리 밖으로 갔을 때)
  • 이렇게 정리 해주었다.

소감

처음 만들 때는 금방금방 제작 했는데, 구현이 어느정도 되면서 버그 잡는데 시간을 더 쓰는 듯하다

profile
게임 개발자가 되기 위해서 공부하는 중입니다.

0개의 댓글