I’m recently studying the source code about AI in UE4, and I notice UE4 seems to have a navigation System supporting finding path asynchronously(Because I find a function called “FindPathAsync” in NavigationSytem.cpp), but I can not find any places using this function in source code or a simple example about this, even in Blueprint I can not find any related functions, so I want to know how to use it, Is there a simple example about it?
1 Like
Still there’s nothing out there. Can anyone provide an example?
1 Like
This is a snippet of my code used to get path from a character to a mission objective:
void AHeroCharacterBase::ShowPathToObjective()
{
FObjectiveBase lastObjective;
bool isObjectiveFound = false;
AChroniclesGameMode* gameMode = Cast<AChroniclesGameMode>(GetWorld()->GetAuthGameMode());
if (gameMode)
{
if (IsValid(gameMode->GetObjectivesManager()))
{
TArray<FObjectiveBase> objectives = gameMode->GetObjectivesManager()->GetVisibleObjectivesWithLocation();
if (objectives.Num() > 0)
{
lastObjective = objectives[objectives.Num() - 1];
isObjectiveFound = true;
}
}
}
if (isObjectiveFound)
{
FNavAgentProperties navAgentProperties;
navAgentProperties.AgentHeight = 100;
navAgentProperties.AgentRadius = 10;
navAgentProperties.bCanWalk = true;
navAgentProperties.bCanFly = false;
FPathFindingQuery navParams;
navParams.EndLocation = lastObjective.GetLocation();
navParams.StartLocation = GetActorLocation();
ANavigationData* navData = GetWorld()->GetNavigationSystem()->MainNavData;
navParams.QueryFilter = UNavigationQueryFilter::GetQueryFilter<UNavigationQueryFilter>(navData);
navParams.NavData = navData;
FNavPathQueryDelegate del;
del.BindUObject(this, &AHeroCharacterBase::PathToObjectiveFound);
GetWorld()->GetNavigationSystem()->FindPathAsync(navAgentProperties, navParams, del, EPathFindingMode::Regular);
}
}
void AHeroCharacterBase::PathToObjectiveFound(uint32 aPathId, ENavigationQueryResult::Type aResultType, FNavPathSharedPtr aNavPointer)
{
FNavPathPoint lastNavPoint;
bool isFirstPoint = true;
for (FNavPathPoint navPoint : aNavPointer->GetPathPoints())
{
DrawDebugPoint(GetWorld(), navPoint.Location, 10, FColor::Red, false, 100);
if (!isFirstPoint)
{
DrawDebugLine(GetWorld(), lastNavPoint.Location, navPoint.Location, FColor::Red, false, 100);
}
lastNavPoint = navPoint;
isFirstPoint = false;
}
}
3 Likes