From 44bf11634041221888a56d46ecb45bd717326b79 Mon Sep 17 00:00:00 2001 From: PHILIP WHITE Date: Thu, 28 Sep 2023 21:26:45 +0100 Subject: [PATCH] Add AI Task for Random Patrolling of a Set Area --- .../AI/BTTask_FindRandomLocation.cpp | 32 +++++++++++++++++++ .../AI/BTTask_FindRandomLocation.h | 24 ++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 EndlessVendetta/Source/EndlessVendetta/AI/BTTask_FindRandomLocation.cpp create mode 100644 EndlessVendetta/Source/EndlessVendetta/AI/BTTask_FindRandomLocation.h diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/BTTask_FindRandomLocation.cpp b/EndlessVendetta/Source/EndlessVendetta/AI/BTTask_FindRandomLocation.cpp new file mode 100644 index 00000000..62a3d9b8 --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/BTTask_FindRandomLocation.cpp @@ -0,0 +1,32 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "BTTask_FindRandomLocation.h" + +#include "AI_EnemyController.h" +#include "NavigationSystem.h" +#include "BehaviorTree/BlackboardComponent.h" + +UBTTask_FindRandomLocation::UBTTask_FindRandomLocation(FObjectInitializer const& ObjectInitializer) +{ + NodeName = TEXT("Find Random Location"); +} + +EBTNodeResult::Type UBTTask_FindRandomLocation::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) +{ + if (const AAI_EnemyController* const AIController = Cast(OwnerComp.GetAIOwner())) + { + if (UBlackboardComponent* const Blackboard = OwnerComp.GetBlackboardComponent()) + { + FVector const Origin = AIController->GetPawn()->GetActorLocation(); + const UNavigationSystemV1* const NavSystem = UNavigationSystemV1::GetCurrent(GetWorld()); + if (FNavLocation RandomLocation; NavSystem->GetRandomPointInNavigableRadius(Origin, SearchRadius, RandomLocation)) + { + Blackboard->SetValueAsVector(GetSelectedBlackboardKey(), RandomLocation.Location); + FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded); + return EBTNodeResult::Succeeded; + } + } + } + return EBTNodeResult::Failed; +} diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/BTTask_FindRandomLocation.h b/EndlessVendetta/Source/EndlessVendetta/AI/BTTask_FindRandomLocation.h new file mode 100644 index 00000000..e3b5df85 --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/BTTask_FindRandomLocation.h @@ -0,0 +1,24 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "BehaviorTree/Tasks/BTTask_BlackboardBase.h" +#include "BTTask_FindRandomLocation.generated.h" + +/** + * + */ +UCLASS() +class ENDLESSVENDETTA_API UBTTask_FindRandomLocation : public UBTTask_BlackboardBase +{ + GENERATED_BODY() + +public: + explicit UBTTask_FindRandomLocation(FObjectInitializer const& ObjectInitializer); + virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; + +private: + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AI", meta = (AllowPrivateAccess = "true")) + float SearchRadius = 1000.f; +};