BTTask_MoveToward - Asynchronous "Move To" Behavior Tree task

The code above is a bit outdated. Here’s an updated version:

BTTask_MoveToward.h

#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/Tasks/BTTask_BlackboardBase.h"
#include "BTTask_MoveToward.generated.h"

/**
 * 
 */
UCLASS(config=Game)
class [YOURPROJECT_API_MACRO] UBTTask_MoveToward : public UBTTask_BlackboardBase
{
	GENERATED_BODY()

        UBTTask_MoveToward(const FObjectInitializer& ObjectInitializer);

        UPROPERTY(config, Category = Node, EditAnywhere, meta = (ClampMin = "0.0"))
        float AcceptableRadius;
    
        UPROPERTY(Category = Node, EditAnywhere)
        uint32 bAllowStrafe : 1;
    
        UPROPERTY(Category = Node, EditAnywhere)
        TSubclassOf<class UNavigationQueryFilter> FilterClass;
    
        virtual EBTNodeResult::Type ExecuteTask(class UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;
        virtual FString GetStaticDescription() const override;
    
    #if WITH_EDITOR
        virtual FName GetNodeIconName() const override;
    #endif WITH_EDITOR
};

BTTask_MoveToward.cpp

#include "[PATH TO .h file]"
#include "BehaviorTree/BehaviorTree.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "BehaviorTree/Blackboard/BlackboardKeyType_Object.h"
#include "BehaviorTree/Blackboard/BlackboardKeyType_Vector.h"
#include "AIController.h"
#include "Navigation/PathFollowingComponent.h"

UBTTask_MoveToward::UBTTask_MoveToward(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
    , AcceptableRadius(50.f)
    , bAllowStrafe(false)
{
    NodeName = "Move Toward";
    BlackboardKey.AddObjectFilter(this, TEXT("TargetActorKey"), AActor::StaticClass());
    BlackboardKey.AddVectorFilter(this, TEXT("MoveLocationKey"));
}

EBTNodeResult::Type UBTTask_MoveToward::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
    AAIController* MyController = Cast<AAIController>(OwnerComp.GetOwner());
    const UBlackboardComponent* MyBlackboard = OwnerComp.GetBlackboardComponent();

    EPathFollowingRequestResult::Type RequestResult = EPathFollowingRequestResult::Failed;

    if (BlackboardKey.SelectedKeyType == UBlackboardKeyType_Object::StaticClass())
    {
        UObject* KeyValue = MyBlackboard->GetValueAsObject(BlackboardKey.SelectedKeyName);
        AActor* TargetActor = Cast<AActor>(KeyValue);
        if (TargetActor)
        {
            RequestResult = MyController->MoveToActor(TargetActor, AcceptableRadius, true, true, bAllowStrafe, FilterClass);
        }
    }
    else if (BlackboardKey.SelectedKeyType == UBlackboardKeyType_Vector::StaticClass())
    {
        const FVector TargetLocation = MyBlackboard->GetValueAsVector(BlackboardKey.SelectedKeyName);
        RequestResult = MyController->MoveToLocation(TargetLocation, AcceptableRadius, true, true, false, bAllowStrafe, FilterClass);
    }


    if (RequestResult == EPathFollowingRequestResult::Failed)
    {
        return EBTNodeResult::Failed;
    }

    return EBTNodeResult::Succeeded;

}

FString UBTTask_MoveToward::GetStaticDescription() const
{
    return "Moves the character toward the specified point, returning immediately.";
}

#if WITH_EDITOR

FName UBTTask_MoveToward::GetNodeIconName() const
{
    return FName("BTEditor.Graph.BTNode.Task.MoveTo.Icon");
}

#endif	// WITH_EDITOR