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