2024-07-01

프로젝트를 진행하며, FSM 을 통해 각각 Player, NPC, Enemy 를 나누어 구현하고 있었다.
코루틴을 사용하는 방식으로 몬스터 AI 가 잘 동작하는지 확인해보았고,
리팩토링을 통해 BaseState 를 상속 받는 FSM 방식으로 수정하기 시작하였다.
그 이유는, Player 의 FSM 구현 방식이 BaseState 를 상속 받는 방식이라서
같은 방식으로 동작되는 편이 추후 리팩토링이나 디버그 시에도 용이할 것 같기 때문이다.
NavMeshAgent 를 사용하는 NPC 를 담당한 팀원과 함께 여러 실험을 해보며
한 가지 상태씩 차근차근 동작 방식을 수정해나갔다.
동작 방식을 수정하며 와이어프레임도 일부 변경되었다.
몬스터나 NPC 는 대기, 이동 상태에서 타겟을 탐지하는 detectRange 와
타겟을 탐지한 후, 공격을 할 수 있는 사거리 attackRange 가 필요하다.
Collider2D 로 사용하기에는 2가지 모두 Trigger 로 사용해야하기 때문에 불가능하였다.
NavMeshAgent 의 Remaining Distance 메서드를 사용하는 방법도 있지만,
타겟과 NavMeshAgent 사이에 벽이 있는 경우, 또는 타겟 사이에 다른 장애물이 존재할 때의 예외처리가 되지 않아 고민을 조금 더 해봐야할 것 같다.
리팩토링을 하기 위해서는,
한 가지 기능을 다른 방식의 코드로 수정하며,
기능의 변화가 없어야 한다.
또한, 그 과정에서 이전에는 찾지 못한 버그도 발견하여
시간이 오래 걸리고 있지만, 더 좋은 코드를 짜기 위한 의미 있는 시간이라고 생각하며 차근차근 코드를 수정해야할 것 같다.