개요
개발 중인 게임에서 외부 자료로 타일맵을 생성하도록 작업했습니다. 모든 것이 정상이라고 생각되었는데 그 위에 StateTree 를 이용한 액터를 배치하니 이상한 현상이 있었습니다. 원래 Navigation Paths 가 생성된 곳에서만 동작을 하는 것이 원칙인데 그곳을 벗어나는 문제가 있었습니다.
문제 확인 및 범위 한정
에디터에서 게임을 실행하고 P(Navigation) 키를 눌러보면 검은색의 Paths 를 볼 수 있는데 이것이 전혀 나타나지 않았습니다.
C++ 코드를 이용해서 타일맵을 생성했습니다. 수동으로 생성한 타일맵에서는 정상적으로 나타났습니다. 동적으로 타일맵이 생성될 때 타이밍이나 등록 문제 때문에 정상적으로 동작하지 않는 것으로 판단되었습니다. 그래서 이 부분을 중심으로 이리저리 코드를 변경해 보았습니다. 그리고 이상한 점이 Outliner 에서 동적으로 생성된 타일맵을 한번 선택해 주면 정상적으로 동작했습니다. 아예 안되는 것은 아니라는 것을 확인했습니다.
해결
결국 등록과 관련한 문제였습니다. 다음과 같이 타이머를 이용해서 약간의 시간 지연 후 등록과정을 거치면 정상적으로 Navigation Paths 가 나타납니다.
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, FTimerDelegate::CreateLambda([&]() {
GetWorld()->GetTimerManager().ClearTimer(TimerHandle);
UNavigationSystemV1* NavSystem = UNavigationSystemV1::GetCurrent(GetWorld());
if (NavSystem) {
NavSystem->OnActorRegistered(this);
NavSystem->Build();
}
}), 0.2f, false);
핵심은 7번째 행인데 OnActorRegistered 메소드 수행 후 빌드해 주면 정상적으로 StateTree 를 사용한 액터가 정상적으로 동작하게 됩니다.
결과만 보았을 때는 간단한 것 같지만 이것을 알아내는데 상당한 시간이 소요되었습니다. 필자와 같은 문제를 겪은 분들께 도움이 되었으면 좋겠습니다.
