언리얼엔진/AI
[NPC 이동] Navi에서 랜덤값을 불러오지 못해 NPC가 이동하지 않는 경우
예상밖의C
2024. 1. 28. 22:03
포폴을 만들 때 언리얼엔진5 AI 순찰 구현에서는
FNavLocation EndPatrolLocation;
if (true == NS->GetRandomPointInNavigableRadius(FVector::ZeroVector, AIController->PatrolRadius, EndPatrolLocation))
{
OwnerComp.GetBlackboardComponent()->SetValueAsVector(ASAIController::EndPatrolPositionKey, EndPatrolLocation.Location);
return Result = EBTNodeResult::Succeeded;
}
와 같은 네비게이션 시스템에서 랜덤 위치를 불러오는 방법을 주로 사용한다(서치를 해도 보통 이 방법을 씀)
그런데 이 방법의 문제는
1. 시작 시에 계속 같은 곳을 감(첫번째 시작에서도 왼쪽 구석으로 갔고 두번째, 세번째 게임 스타트에서도 그쪽으로 감..)
2. 값을 찾아올 때 한쪽으로 쏠림 현상이 나타나기도 함
3. 주변에 길을 막고있는 오브젝트가 있거나, 복잡한 맵?의 경우 랜덤으로 가져온 값에 도달할 수 없다고 판단하면 값이 true가 되지 않아 이 노드를 넘어가고 EndPatrolLocation을 찾지 못해 무한정 Wait만 하고 있게 된다.
그래서 이 문제를 해결하기 위해 그냥 랜덤값의 로케이션을 찾아서 EndPatrolLocation에 넣어야겠다고 생각했다.
총 4방향 정도 랜덤으로 순찰하도록 하였고( X+200/ X-200 / Y-200 / Y+200) 제자리로 돌아오길 원한다면 뒤에 Move To 노드를 한개 더 붙여서 다시 Start 지점으로 오게 하면 될 것이다.
FVector StartPatrolPosition = OwnerComp.GetBlackboardComponent()->GetValueAsVector(ASAIController::StartPatrolPositionKey);
float RandomX = FMath::RandRange(0, 1) == 0 ? -200.f : 200.f;
float RandomY = FMath::RandRange(0, 1) == 0 ? -200.f : 200.f;
FVector EndPatrolLocation = StartPatrolPosition + FVector(RandomX, RandomY, 0.f);
OwnerComp.GetBlackboardComponent()->SetValueAsVector(ASAIController::EndPatrolPositionKey, EndPatrolLocation);
시도한 코드는 위와 같고, 잘 되는 것을 확인할 수 있었다.