EDR_Project / Patrol

 

EnemyCharacter의 순찰기능에 사용된 비헤이비어트리 태스크 입니다.

"이득우의언리얼 c++ 게임 개발의 정석" 을 참고하였습니다.

BTT_EDR_FindPatrolPosTask.h

 

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/BTTaskNode.h"
#include "CoreMinimal.h"
#include "BehaviorTree/Tasks/BTTask_BlackboardBase.h"
#include "BehaviorTree/BehaviorTreeTypes.h"
#include "UObject/UObjectGlobals.h"
#include "BTT_EDR_FindPatrolPosTask.generated.h"

UCLASS(Blueprintable)
class EDR_API UBTT_EDR_FindPatrolPosTask : public UBTTaskNode
{
	GENERATED_BODY()
public:
	UBTT_EDR_FindPatrolPosTask(FObjectInitializer const& object_initializer);
	EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory);
private:
	// 탐색 범위
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Search", meta = (AllowPrivateAccess = "true"))
	float search_radius = 1500.f;
};

 

반응형

 

BTT_EDR_FindPatrolPosTask.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "BTT_EDR_FindPatrolPosTask.h"
#include "Enemy_EDR_AIController.h"
#include "NavigationSystem.h"
#include "BehaviorTree/BehaviorTree.h"
#include "BehaviorTree/Blackboard/BlackboardKeyType_Vector.h"
#include "BlackBoardKeys.h"
#include "BehaviorTree/BlackboardComponent.h"

UBTT_EDR_FindPatrolPosTask::UBTT_EDR_FindPatrolPosTask(FObjectInitializer const& object_initializer)
{
	//에디터에 보여질 TaskNode의 이름
	NodeName = TEXT("FindPatrolPosTask");
}




EBTNodeResult::Type UBTT_EDR_FindPatrolPosTask::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{

	auto Controller = Cast<AEnemy_EDR_AIController>(OwnerComp.GetAIOwner());
	auto Enemy = Controller->GetPawn();

	if (nullptr == Enemy) {
		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Enemy Initialize faild!"));
		return EBTNodeResult::Failed;
	}
	//현재 에디터에 설정된 navi mesh로 초기화
	UNavigationSystemV1* const NavSystem = UNavigationSystemV1::GetCurrent(GetWorld());
	if (nullptr == NavSystem) {
		//navi mesh가 없다면 실패를 반환
		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("No Enemy in Navi"));
		return EBTNodeResult::Failed;
	}

	FVector const Origin = Enemy->GetActorLocation();
	FNavLocation NextPatrol;

	//NextPatrol변수에 임의의 location 데이터를 넣고 다시 TargetLocation키의 value에 값을 넣어준다.
	if (NavSystem->GetRandomPointInNavigableRadius(Origin, search_radius, NextPatrol, nullptr))
	{
		Controller->get_blackboard()->SetValueAsVector(AEnemy_EDR_AIController::TargetLocation, NextPatrol.Location);
		//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("NextPosSuccess!"));
	}

	//그 다음 이동할 곳을 확인하기 위한 디버그메시지
	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("%s"), *NextPatrol.Location.ToString()));

	FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded);
	return EBTNodeResult::Succeeded;
}

 

랜덤 위치를 블랙보드 변수 TargetLocation에 담아 탐색하게 하였습니다.

 

 

Enemy_EDR_BehaviorTree

 

비헤이비어트리에 적용한 모습입니다.

'Unreal Engine 5 > EDR_Project' 카테고리의 다른 글

EDR_Project / CanAttack  (0) 2024.10.17
EDR_Project / Detect  (0) 2024.10.17
EDR_Project / BehaviorTree, BlackBoard  (0) 2024.10.17
EDR_Project / Character  (0) 2024.10.17
EDR_Project / AIController  (0) 2024.10.17