Quick answer: MoveTo succeeds within AcceptanceRadius of the target (not exactly at it). Lower AcceptanceRadius for precision, but not below the pawn’s capsule radius. If the pawn cannot reach at all, check Nav Mesh Bounds Volume covers the area and Project To Navigation for unreachable destinations.

Here is how to fix Unreal AI MoveTo not reaching destination. Your patrol AI uses MoveTo to walk between waypoints. It stops 50 units short every time. Or it reaches some waypoints but not others. Or it walks in place without making progress. Unreal’s AI movement has several tuning parameters and one misaligned makes the behavior tree misleading.

The Symptom

AIController MoveToLocation / MoveToActor (or BT Move To task) reports Success without the pawn being at the destination. Or it reports Failure even though the destination looks reachable. Or the pawn oscillates near the destination, alternating between approach and stop.

What Causes This

AcceptanceRadius too large. The default AcceptanceRadius (or Radius in BT node) is generous. Once the pawn is within this radius of the target, MoveTo succeeds even if not at the exact point. A patrol that expects exact waypoint arrival needs smaller radius.

Pawn capsule limits closeness. The CharacterController/capsule physical extent means the pawn cannot be on top of the destination point — its feet are a capsule radius away. Setting AcceptanceRadius lower than capsule radius is impossible to satisfy.

Destination off NavMesh. MoveTo projects destinations to the nearest NavMesh point. If the target point is high up, underwater, or far from walkable area, the effective destination is wherever NavMesh projection lands — not where you asked.

NavMeshBoundsVolume missing. Without a NavMeshBoundsVolume covering your playable area, no NavMesh exists and MoveTo always fails.

Path recomputation loops. In dynamic scenes with moving obstacles, MoveTo repeatedly recomputes paths. If obstacles shift the path’s endpoint, the pawn ping-pongs.

The Fix

Step 1: Tune AcceptanceRadius. For precise arrival, set AcceptanceRadius to just above the pawn’s capsule radius:

// C++ direct call
AIController->MoveToLocation(
    Destination,
    5.0f,  // acceptance radius (units)
    true,  // stop on overlap
    true,  // use pathfinding
    true,  // project destination to nav
    true); // can strafe

For BehaviorTree Move To tasks, set the Acceptable Radius value in the task’s Details panel. Too small = impossible to satisfy; find the minimum your pawn can physically hit.

Step 2: Listen to OnMoveCompleted for result.

void AMyAIController::BeginPlay()
{
    Super::BeginPlay();
    ReceiveMoveCompleted.AddDynamic(this, &AMyAIController::OnMoveCompleted);
}

void AMyAIController::OnMoveCompleted(FAIRequestID RequestID, EPathFollowingResult::Type Result)
{
    switch (Result)
    {
        case EPathFollowingResult::Success:
            UE_LOG(LogTemp, Log, TEXT("Arrived"));
            break;
        case EPathFollowingResult::Blocked:
            UE_LOG(LogTemp, Warning, TEXT("Path blocked"));
            break;
        case EPathFollowingResult::OffPath:
            UE_LOG(LogTemp, Warning, TEXT("Off path"));
            break;
        case EPathFollowingResult::Aborted:
            UE_LOG(LogTemp, Log, TEXT("Aborted"));
            break;
    }
}

The Result value tells you exactly what happened. Act accordingly — retry on Blocked, pick new target on OffPath.

Step 3: Project destinations to NavMesh manually.

#include "NavigationSystem.h"

FVector GetNavigableDestination(UWorld* World, FVector Desired)
{
    UNavigationSystemV1* NavSys = UNavigationSystemV1::GetCurrent(World);
    FNavLocation Result;
    if (NavSys->ProjectPointToNavigation(
        Desired, Result, FVector(500, 500, 500)))
    {
        return Result.Location;
    }
    return Desired; // fallback
}

Call this to snap any destination to a valid NavMesh point before passing to MoveTo. Handles off-mesh targets gracefully.

Step 4: Verify NavMesh covers area. Place a NavMeshBoundsVolume encompassing your level. Press P to show NavMesh in viewport. Green areas are walkable. Gaps indicate geometry the pawn cannot traverse. Rebuild Navigation (Build menu) after geometry changes.

BehaviorTree Considerations

In BT, Move To is a task that succeeds or fails the node. Combine with a decorator that checks pre-conditions (is target valid, is path computable). This prevents endless retry loops on unreachable targets.

“MoveTo is approximate by design. Acceptance radius + path projection tell you how close is ‘close enough.’ Be explicit about both.”

Related Issues

For general navigation debugging, see the Unity equivalent NavMeshAgent Stuck on Edge. For Unreal replication issues, Actor Replication Not Working.

AcceptanceRadius matched to capsule. Project to nav. Listen to OnMoveCompleted. Three habits.