在(三十四)的基础上,我们再增添一个功能,让AI来跟随控制器控制的PAWN。
创建一个TaskBlackBoardBase类,是基于黑板数据的任务类。
1 // Fill out your copyright notice in the Description page of Project Settings.
2
3 #pragma once
4
5 #include "CoreMinimal.h"
6 #include "BehaviorTree/Tasks/BTTask_BlackboardBase.h"
7 #include "MyBTTask_FllowPlayer.generated.h"
8
9 /**
10 *
11 */
12 UCLASS()
13 class AI_SECOND_API UMyBTTask_FllowPlayer : public UBTTask_BlackboardBase
14 {
15 GENERATED_BODY()
16 public:
17 EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;
18 };
继承自父类的方法,ExecuteTask,返回值类型为EBTNodeResult,结果又Succeeded,InProgress和Failed.
1 // Fill out your copyright notice in the Description page of Project Settings.
2
3
4 #include "MyBTTask_FllowPlayer.h"
5 #include "MyAIController.h"
6 #include "AI_SECONDCharacter.h"
7 #include "BehaviorTree/Blackboard/BlackboardKeyType_Object.h"
8
9 EBTNodeResult::Type UMyBTTask_FllowPlayer::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) {
10
11 auto EnemyController = Cast<AMyAIController>(OwnerComp.GetAIOwner());
12 auto blackboard = EnemyController->AIControllerBeTree->GetBlackboardComponent();
13
14 if (EnemyController) {
15 auto target = Cast<AAI_SECONDCharacter>(blackboard->GetValue<UBlackboardKeyType_Object>(EnemyController->target));
16
17 EnemyController->MoveToActor(target,50.0f);
18 return EBTNodeResult::Succeeded;
19 }
20 else {
21 return EBTNodeResult::Failed;
22 }
23 }
从黑板上读取PAWN的位置,控制器调用MoveToActor方法,让AI走向PAWN。该函数需要返回值。
挂载任务:
效果如下: