[UE5] 언리얼5 AI - Behavior Tree_BTTaskNode

AnJH·2024년 5월 26일

Behavior Tree_BTTaskNode

Task노드는 Behavior Tree에서 Blackboard의 값을 사용하기 위한 노드이다.

위와 같이 미리 생성되어있는 Task노드들도 존재하고, 이중에서 Find Patrol Pos와 같이 직접 만들어서 사용도 가능하다.

C++ Class에서 BTTaskNode를 생성해보자.

  • BTTask_FindPatrolPos.h
#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/BTTaskNode.h"
#include "BTTask_FindPatrolPos.generated.h"

/**
 * 
 */
UCLASS()
class THELASTSURVIVOR_API UBTTask_FindPatrolPos : public UBTTaskNode
{
	GENERATED_BODY()
	
public:
	UBTTask_FindPatrolPos();
	virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;
};

Task노드는 실행 시, ExecuteTask()함수를 실행한다. 이 함수는 Aborted, Faild, Succeeded, InProgress 총 4가지 상태로 반환된다.

Faild와 Succeeded는 말 그대로 실패와 성공을 뜻하고, Aborted는 실행 도중 중단, InProgress는 이후에 결과를 알려줄 예정의 상태이다.

  • BTTask_FindPatrolPos.CPP
#include "BTTask_FindPatrolPos.h"
#include "MainAIController.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "NavigationSystem.h"

UBTTask_FindPatrolPos::UBTTask_FindPatrolPos()
{
	NodeName = TEXT("FindPatrolPos");
}

EBTNodeResult::Type UBTTask_FindPatrolPos::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
	EBTNodeResult::Type Result = Super::ExecuteTask(OwnerComp, NodeMemory);

	auto ControllingPawn = OwnerComp.GetAIOwner()->GetPawn(); 
	if (ControllingPawn == nullptr) {
		return EBTNodeResult::Failed;
	}

	UNavigationSystemV1* NavSystem = UNavigationSystemV1::GetNavigationSystem(ControllingPawn->GetWorld());
	if (NavSystem == nullptr) {
		return EBTNodeResult::Failed;
	}

	FVector Origin = OwnerComp.GetBlackboardComponent()->GetValueAsVector(AMainAIController::HomePosKey);
	FNavLocation NextPatrol;

	if (NavSystem->GetRandomPointInNavigableRadius(Origin, 500.0f, NextPatrol)) {
		OwnerComp.GetBlackboardComponent()->SetValueAsVector(AMainAIController::PatrolPosKey, NextPatrol.Location);
		return EBTNodeResult::Succeeded;
	}
	return EBTNodeResult::Failed;
}

AI가 임의의 좌표로 이동하는 Task를 만들고자 한다.

생성자에서 해당 노드에 대한 이름을 지정해주었고, 아래 ExucuteTask에선 실질적으로 Task노드가 실행될 때, 발생될 코드를 작성한 것이다.

AI의 위치를 저장하고 있는 HomePosKey와 특정 거리만큼 떨어진 랜덤 Vector값을 담을 PatrolKey로 구성이 되어있다.

정상적으로 좌표를 찾아서 전달한다면 Secceeded가 반환될 것이고, 이외 나머지 상황들에 대해서는 Failed를 반환하게 했다.

위와 같은 코드를 통해 다음과 같은 TaskNode를 사용할 수 있다.

AI에게 특정 행동을 지시하고 싶다면 이 TaskNode를 사용해야 할 것이다.

0개의 댓글