Skip to content

Instantly share code, notes, and snippets.

@CoffeeVampir3
Created November 27, 2023 22:20
Show Gist options
  • Save CoffeeVampir3/3a99ae7a9dbea7ca9e20820152b9565d to your computer and use it in GitHub Desktop.
Save CoffeeVampir3/3a99ae7a9dbea7ca9e20820152b9565d to your computer and use it in GitHub Desktop.
failed attempt at succeeding
NecroAiTask UNecroAiComponent::MoveToPoint(const FVector Dest, const float AcceptanceRadius = 160.0f) const
{
auto NavSys = Cast<UNavigationSystemV1>(GetWorld()->GetNavigationSystem());
check(NavSys);
auto NavProps = FNavAgentProperties(ControlledCharacter->GetSimpleCollisionRadius(), 128.f);
NavProps.bCanWalk = true;
NavProps.bCanFly = false;
auto Query = FPathFindingQuery();
Query.NavAgentProperties = NavProps;
Query.StartLocation = ControlledCharacter->GetActorLocation();
Query.NavData = NavSys->MainNavData;
Query.QueryFilter = UNavigationQueryFilter::GetQueryFilter<UNavigationQueryFilter>(*NavSys->MainNavData);
ENavigationQueryResult::Type QueryResult;
bool QueryComplete;
TSharedPtr<FNavigationPath> ResultingPath;
FNavPathQueryDelegate OnPathGenerated;
OnPathGenerated.BindLambda([&](uint PathId, const ENavigationQueryResult::Type QResultType, TSharedPtr<FNavigationPath> Path)
{
QueryResult = QResultType;
QueryComplete = true;
ResultingPath = Path;
});
NavSys->FindPathAsync(NavProps, Query, OnPathGenerated);
while(!QueryComplete)
{
co_await std::suspend_always{};
}
if(QueryResult != ENavigationQueryResult::Type::Success)
{
if(QueryResult == ENavigationQueryResult::Type::Error)
{
UE_LOG(LogTemp, Warning, TEXT("Error query!"));
}
if(QueryResult == ENavigationQueryResult::Type::Invalid)
{
UE_LOG(LogTemp, Warning, TEXT("Invalid query!"));
}
if(QueryResult == ENavigationQueryResult::Type::Fail)
{
UE_LOG(LogTemp, Warning, TEXT("Failed query!"));
}
co_return;
}
UE_LOG(LogTemp, Warning, TEXT("Successful query!"));
SplineComponent->ClearSplinePoints();
for (const auto& Point : ResultingPath->GetPathPoints())
{
SplineComponent->AddSplinePoint(Point, ESplineCoordinateSpace::World, false);
DrawDebugSphere(ControlledCharacter->GetWorld(), Point, 8.f, 8, FColor::Red, false, 5.f);
}
SplineComponent->UpdateSpline();
while(true)
{
const auto ClosestSplinePoint = SplineComponent->FindLocationClosestToWorldLocation(ControlledCharacter->GetActorLocation(), ESplineCoordinateSpace::World);
const auto SplineDirection = SplineComponent->FindDirectionClosestToWorldLocation(ClosestSplinePoint, ESplineCoordinateSpace::World);
ControlledCharacter->AddMovementInput(SplineDirection);
const float DistanceToDest = (ClosestSplinePoint - Dest).Length();
if(DistanceToDest <= AcceptanceRadius) {
co_return;
}
co_await std::suspend_always{};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment