이전에 만든 스폰 볼륨은 박스 내 정확한 XY 좌표에 스폰이 됐었다.
그리고 고저차 때문에 Z 좌표 보정을 두었더니 건물이나 울타리 등 다른 액터 위에 스폰되기도 하는 버그가 있었다.
그래서 이번엔 스폰 볼륨 내에 AI 나 캐릭터를 스폰하는 NavMesh 를 찾아 그 위에만 깔리도록 수정하려고 한다.
...
#include "NavigationSystem.h"
...
ACRItemBase* ACRItemSpawnVolume::SpawnItem()
{
...
// 추가된 내용
FVector NavXY = XY;
if (UNavigationSystemV1* NavSys = FNavigationSystem::GetCurrent<UNavigationSystemV1>(GetWorld()))
{
const ANavigationData* NavData = NavSys->GetDefaultNavDataInstance(FNavigationSystem::DontCreate);
const FVector QueryExtent(100.f, 100.f, TraceUp + TraceDown);
FNavLocation NavLoc;
if (NavData && NavSys->ProjectPointToNavigation(XY, NavLoc, QueryExtent, NavData))
{
NavXY = NavLoc.Location;
}
else
{
return nullptr;
}
}
// 추가 내용 끝
FHitResult Hit;
if (!FindGroundedLocation(NavXY, Hit)) return nullptr; // XY 대신 NavXY 로
}
...
기존에 랜덤하게 가져온 XY 좌표를 수정 가능한 새로운 FVector 변수 NavXY 에 담아준다.
이후 월드에 있는 Nav 시스템을 가져와 NavData 로 담아주고,
Z 좌표 범위를 미리 정적 변수로 선언해둔 값으로 보정해준다.
마지막으로 NavMesh 의 좌표를 가져와서 이전에 만들어둔 스폰 좌표를 찾는 함수 FindGroundedLocation() 함수에 XY 대신 NavXY 좌표를 넣어주면 된다.