UAITask_MoveTo* UAITask_MoveTo::AIMoveTo(AAIController* Controller, FVector InGoalLocation, AActor* InGoalActor, float AcceptanceRadius, EAIOptionFlag::Type StopOnOverlap, EAIOptionFlag::Type AcceptPartialPath, bool bUsePathfinding, bool bLockAILogic) { UAITask_MoveTo* MyTask = Controller ? UAITask::NewAITask<UAITask_MoveTo>(*Controller, EAITaskPriority::High) : nullptr; if (MyTask) { FAIMoveRequest MoveReq; if (InGoalActor) { MoveReq.SetGoalActor(InGoalActor); } else { MoveReq.SetGoalLocation(InGoalLocation); } MoveReq.SetAcceptanceRadius(AcceptanceRadius); MoveReq.SetReachTestIncludesAgentRadius(FAISystem::PickAIOption(StopOnOverlap, MoveReq.IsReachTestIncludingAgentRadius())); MoveReq.SetAllowPartialPath(FAISystem::PickAIOption(AcceptPartialPath, MoveReq.IsUsingPartialPaths())); MoveReq.SetUsePathfinding(bUsePathfinding); if (Controller) { MoveReq.SetNavigationFilter(Controller->GetDefaultNavigationFilterClass()); } MyTask->SetUp(Controller, MoveReq); if (bLockAILogic) { MyTask->RequestAILogicLocking(); } } return MyTask; }
UAIAsyncTaskBlueprintProxy* UAIBlueprintHelperLibrary::CreateMoveToProxyObject(UObject* WorldContextObject, APawn* Pawn, FVector Destination, AActor* TargetActor, float AcceptanceRadius, bool bStopOnOverlap) { check(WorldContextObject); if (!Pawn) { return NULL; } UAIAsyncTaskBlueprintProxy* MyObj = NULL; AAIController* AIController = Cast<AAIController>(Pawn->GetController()); if (AIController) { UWorld* World = GEngine->GetWorldFromContextObject( WorldContextObject ); MyObj = NewObject<UAIAsyncTaskBlueprintProxy>(World); FAIMoveRequest MoveReq; MoveReq.SetUsePathfinding(true); MoveReq.SetAcceptanceRadius(AcceptanceRadius); MoveReq.SetStopOnOverlap(bStopOnOverlap); if (TargetActor) { MoveReq.SetGoalActor(TargetActor); } else { MoveReq.SetGoalLocation(Destination); } FPathFindingQuery Query; const bool bValidQuery = AIController->PreparePathfinding(MoveReq, Query); if (bValidQuery) { const FAIRequestID RequestID = AIController->RequestPathAndMove(MoveReq, Query); if (RequestID.IsValid()) { MyObj->AIController = AIController; MyObj->AIController->ReceiveMoveCompleted.AddDynamic(MyObj, &UAIAsyncTaskBlueprintProxy::OnMoveCompleted); MyObj->MoveRequestId = RequestID; } else { World->GetTimerManager().SetTimer(MyObj->TimerHandle_OnNoPath, MyObj, &UAIAsyncTaskBlueprintProxy::OnNoPath, 0.1f, false); } } } return MyObj; }