이번 팀프로젝트에서 맡게된 Enemy AI 파트 발표 부분
깃허브 링크
Enemy AI는 FSM 패턴과 NavMeshAgent 를 활용해서 만들었습니다.
각 스테이트들은 클래스로 정의하여 관리하고, 스테이트에 돌입하면 그에 맞는 행동과 애니메이션을 수행합니다.
Idle 스테이트는 대기하며 주변이 플레이어가 없다면,
NavMesh.SamplePosition 으로 다음 목적지를 탐색하고
Wander 스테이트로 변환됩니다.
주변에 플레이어가 추격 범위 안에 있다면 Chasing 스테이트로 변환하고
NavMesh.SetDestination 으로 플레이어를 추격합니다.
플레이어가 공격 범위 안으로 들어온다면,
Aiming 스테이트 변환하고 플레이어를 조준합니다.
마지막 공격 시간을 체크하여 공격 레이팅 시간이 지났다면,
Attack 스테이트로 변환하고 플레이어를 사격합니다.
이때 플레이어가 계속 공격 가능 범위 안에 있다면 공격 레이팅 시간을 체크하며,
Aiming 스테이트와 Attack 스테이트 변환을 반복합니다.
Enemy 데이터 관리와 저장에 어려움이 있었습니다.
초기에 작업할 때는 Hierachy에 직접적으로 에너미 프리팹을 올려놓고 작업했습니다.
이 때문에 게임을 저장할때 Enemy들의 현재 체력과 마지막 위치를 저장하기로 했지만,
Enemy 들이 개별적으로 따로 존재하고 있고 관리 시스템이 없었기에 Enemy 데이터에 접근하기 어려웠습니다.
이를 해결하기 위하여 Enemy 리스트를 만들고 Enemy 를 동적 생성하여 리스트에 추가하였습니다.
리스트로 관리하게 되며 저장관리와 게임 클리어 조건을 확인 하기 위한 Enemy 처치 카운트가 용이해졌습니다.
public const double Pi = 3.14159;
public readonly int NumberOfSeats;
public Car(int seats)
{
NumberOfSeats = seats; // 생성자에서 값 할당
}