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 |