※ 해당 기록은 Unreal 5.5.3 버전을 기준으로 작성되었습니다.
팀 프로젝트 인원이 한 명 증가하면서 타나토스를 새로 만들기로 했다. 타나토스와의 경쟁에서 빠질 수 없는 것이 바로 몬스터다.
기본 구조는 Boss와 같다. 적의 기본 정보를 갖고 있는 EnemyInfo 클래스를 Boss와 Monster를 상속하도록 했다. Getter / Setter를 포함하고, 또 플레이어를 공격하는 함수를 virtual로 작성하여 자식 클래스에서 각각 구현할 수 있도록 했다.
Boss와 Monster 둘 다 수업 때의 EnemyFSM을 참고해서 만들었다. 그래서 거의 비슷하다. 그러나 Boss와 달리 Monster는 PhaseChange 상태가 없다. 아마 이 정도로 구현할 것이라고 예상했다면, 미리 앞서서 상위 클래스에서 기능과 상태를 정의하고 상속받아 사용할걸 했나 싶다.

차이점은 Monster는 NavMesh와 AIController를 이용해서 움직이도록 했다. 둘을 사용하기 위해서는 Build.cs에 이를 추가해주어야 오류가 나지 않는다.
//Project_Pluto.Build.cs에서
public class Project_Pluto : ModuleRules
{
public Project_Pluto(ReadOnlyTargetRules Target) : base(Target)
{
...
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore",
"EnhancedInput", "UMG", "Niagara" , "NavigationSystem", "AIModule"});
...
}
}
//Monster.cpp에서
AMonster::AMonster(){
...
AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;
}
//MonsterFSM.cpp에서
void UMonsterFSM::State_Move(){
...
auto ns = UNavigationSystemV1::GetNavigationSystem(GetWorld());
// 목적지 길찾기 경로 데이터 검색
FPathFindingQuery query;
FAIMoveRequest req;
// 목적지에서 인지할 수 있는 범위
req.SetAcceptanceRadius(3.f);
req.SetGoalLocation(dir);
// 길찾기 위한 쿼리 생성
AI->BuildPathfindingQuery(req, query);
// 길찾기 결과를 가져오기
FPathFindingResult result = ns->FindPathSync(query);
// 목적지까지 길 찾기 성공 여부 확인
if (result.Result == ENavigationQueryResult::Success)
{
//타겟으로 이동
AI->MoveToLocation(dir);
}
else
{
//랜덤 위치로 이동
auto randResult = AI->MoveToLocation(randomPos);
//목적지에 도착하면
if (randResult == EPathFollowingRequestResult::AlreadyAtGoal)
{
//새로운 랜덤 위치 가져오기
GetRandomPosInNavMesh(me->GetActorLocation(), me->GetAttRange (), randomPos);
}
}
...
}
Monster를 Spawner를 통해서 생성시킬 예정이므로, Monster의 생성자에서 스폰될 때 자동으로 AIController가 붙을 수 있도록 해준다. 또 Player를 감지하기 전에는 랜덤한 위치로 이동하며 Patrol시켜 Player를 탐지하면 그 방향으로 이동하게 했다.

기획 상 세 가지의 공격 타입을 각각 가진 Monster를 세 개 만들고자 했지만, 시간 상으로 원거리 탄막만을 날리는 Monster로만 구현했다. Boss는 5방향으로 동시에 10번씩 총 50발을 발사하는 패턴이었지만, Monster는 5방향으로 한발씩만 날리도록 구현했다.

원래 프로젝트가 알파 테스트까지만 계획되어있어 개발은 여기서 마친다. 그러나 알파 발표 당일에 베타까지 기한이 연장되었다. 사운드를 추가할 것이다.