23{
25 SCOPE_CYCLE_COUNTER(STATGROUP_AIToolKit_Behaviors);
26 SCOPE_CYCLE_COUNTER(STATGROUP_AIToolKit_Tasks);
27 TArray<AActor*> ActorsToIgnore;
28 TArray<FHitResult> HitArray;
29
30 if(OwnerComp.GetAIOwner() != nullptr && OwnerComp.GetAIOwner()->GetPawn() != nullptr)
31 {
32 const FVector Start = OwnerComp.GetAIOwner()->GetPawn()->GetActorLocation();
33
34 const FVector End = OwnerComp.GetAIOwner()->GetPawn()->GetActorForwardVector() + Start;
35 TArray<TEnumAsByte<EObjectTypeQuery>> NameOfObjects;
37
38 EDrawDebugTrace::Type DebugDraw = EDrawDebugTrace::None;
40 {
41 DebugDraw = EDrawDebugTrace::ForDuration;
42 }
43
44 const bool bHit = UKismetSystemLibrary::SphereTraceMultiForObjects(GetWorld(), Start, End,
Radius, NameOfObjects,
false, ActorsToIgnore, DebugDraw, HitArray,
true,
TraceColor,
TargetPatrolPointColor, 1.0f);
45 if(bHit)
46 {
47 AActor* BestActor = nullptr;
48 float BestDistance = 10000000000000.0f;
49 for(
const FHitResult
Hit : HitArray)
50 {
53 {
54 BestDistance =
Hit.Distance;
55 BestActor =
Hit.GetActor();
56 }
57 }
58 if(OwnerComp.GetBlackboardComponent() != nullptr && BestActor != nullptr)
59 {
60
61 OwnerComp.GetBlackboardComponent()->SetValueAsVector(
MoveTargetLocation.SelectedKeyName, BestActor->GetActorLocation());
62
63
66 {
67 bool bIsBridgeAvailable = false;
68 AActor* NextPatrolPointActor =
PatrolPoint->GetNextPatrolPointActor(bIsBridgeAvailable);
69
70 OwnerComp.GetBlackboardComponent()->SetValueAsObject(
NextPatrolPoint.SelectedKeyName, NextPatrolPointActor);
71 OwnerComp.GetBlackboardComponent()->SetValueAsBool(
bBridgeAvailable.SelectedKeyName, bIsBridgeAvailable);
72
73 if(bIsBridgeAvailable)
74 {
75 AActor* NextBridgePatrolPointActor =
PatrolPoint->GetNextBridgePatrolPointActor();
76 OwnerComp.GetBlackboardComponent()->SetValueAsObject(
NextBridgePatrolPoint.SelectedKeyName, NextBridgePatrolPointActor);
77 }
78
79 float WaitTimeMin = 0.0f;
80 float WaitTimeMax = 0.0f;
81 bool bWaitTime =
PatrolPoint->GetTimeToWait(WaitTimeMin, WaitTimeMax);
82 if(bWaitTime)
83 {
84 float WaitTimeTotal = UKismetMathLibrary::RandomFloatInRange(WaitTimeMin, WaitTimeMax);
85 OwnerComp.GetBlackboardComponent()->SetValueAsFloat(
WaitTime.SelectedKeyName, WaitTimeTotal);
86 }
87 OwnerComp.GetBlackboardComponent()->SetValueAsVector(
MoveTargetLocation.SelectedKeyName, BestActor->GetActorLocation());
88 }
89 }
90 return EBTNodeResult::Succeeded;
91 }
92 }
93 return EBTNodeResult::Failed;
94}
An interface class for patrol functionality.
Definition PatrolInterface.h:24
FBlackboardKeySelector NextBridgePatrolPoint
Definition BTT_FindRandomPatrolPoint.h:43
FBlackboardKeySelector MoveTargetLocation
Definition BTT_FindRandomPatrolPoint.h:37
bool bDebuggingMode
Definition BTT_FindRandomPatrolPoint.h:23
virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent &OwnerComp, uint8 *NodeMemory) override
Definition BTT_FindRandomPatrolPoint.cpp:22
FBlackboardKeySelector NextPatrolPoint
Definition BTT_FindRandomPatrolPoint.h:41
FColor TargetPatrolPointColor
Definition BTT_FindRandomPatrolPoint.h:31
FBlackboardKeySelector bBridgeAvailable
Definition BTT_FindRandomPatrolPoint.h:39
float Radius
Definition BTT_FindRandomPatrolPoint.h:49
FBlackboardKeySelector WaitTime
Definition BTT_FindRandomPatrolPoint.h:46
TEnumAsByte< EObjectTypeQuery > ObjectChannelToUse
Definition BTT_FindRandomPatrolPoint.h:34
FColor TraceColor
Definition BTT_FindRandomPatrolPoint.h:29