본문 바로가기
[ Unreal5 ]/- 언리얼엔진5 실습

언리얼엔진5 c++ BehaviorTree(Blackboard Set, Move Task)

by MRG 2024. 4. 27.
728x90
반응형

 

 

▣ 먼저 Behavior Tree와 Blackboard를 생성합니다. 

각각 이름 앞에 BT, BB를 붙여서 어떤 파일인지 의도에 맞게 작성합니다.

 

▣ 비헤이비어 트리는 블루프린트와 유사한 시각적 방식으로 생성됩니다. 비헤이비어 트리 그래프(Behavior Tree Graph)에 기능이 탑재된 다양한 노드를 추가하고 연결하는 방식입니다. 비헤이비어 트리가 로직을 실행하는 한편, 비헤이비어 트리가 결정을 내리는 데 필요한 정보인 블랙보드 키(Blackboard Key)는 블랙보드(Blackboard)라는 별도의 에셋에 저장됩니다. 일반적인 워크플로는 블랙보드를 생성하고, 블랙보드 키를 추가한 다음, 블랙보드 에셋을 사용하는 비헤이비어 트리를 생성하는 순서입니다. 블랙보드는 아래 이미지에서처럼 비헤이비어 트리에 할당됩니다.

 

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/behavior-tree-in-unreal-engine---overview?application_version=5.3

 

언리얼 엔진의 비헤이비어 트리 - 개요

언리얼 엔진의 비헤이비어 트리 개념과 전통적인 비헤이비어 트리와의 차이점에 대해 설명합니다.

dev.epicgames.com

 

 

▣ Behavior Tree창에 가서 디테일탭에서 아까 생성한 Blackboard으로 설정합니다. 

 

 

▣ AiController c++ 코드에서 Behavior Tree에 대한 데이터를 저장할 변수를 선언합니다. 

 

 

▣  cpp 파일로 가서 "BehaviorTree/BehaviorTree.h" 헤더를 추가합니다. 

그리고 ConstructorHelpers::FObjectFinder <UBehaviorTree> 코드로 BT오브젝트를 가져오는 코드를 완성합니다.

여기서 중요한 건 경로 텍스처에 맨 앞에 BehaviorTree가 들어가야 합니다. 

 

▣ BeginPlay()에서 RunBehaviorTree함수를 활용하여 BehaviorTree를 실행하는 코드를 완성합니다.

 

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/AIModule/AAIController/RunBehaviorTree?application_version=5.3

 

AAIController::RunBehaviorTree

Starts executing behavior tree.

dev.epicgames.com

 

 

▣ 저장 및 컴파일 후 AiController 블루프린트에서 변수가 잘 대입되어 있는지 확인할 수 있고 AiController가 BehaviorTree와 잘 연결되는 것도 확인할 수 있습니다.

 

 

 

▣ 다시. cpp로 돌아가서  #include "BehaviorTree/BlackboardComponent.h" 헤더를 추가하고 

GetBlackboardComponent()->SetValueAsVector 코드로 Blackoard를 세팅하는 함수를 작성합니다. 

이 코드는 Blackboard에 있는 데이터를 플레이어 위치로 세팅하는 코드입니다.

 

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/AIModule/AAIController/GetBlackboardComponent/2?application_version=5.0

 

AAIController::GetBlackboardComponent

 

dev.epicgames.com

 

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/AIModule/BehaviorTree/UBlackboardComponent/SetValueAsVector?application_version=5.3

 

UBlackboardComponent::SetValueAsVector

 

dev.epicgames.com

 

 

▣ 컴파일 후 Blackboard로 돌아가서 아까 세팅한 SetValueAsVector함수처럼 동일한 이름과 형식으로 데이터를 추가하고 저장 후

 

 

 

▣ 플레이를 하고 확인하면 Player위치가 세팅되는 걸 확인할 수 있습니다.

 

 

 

▣. cpp파일에서 DefaultLocation를 추가하는데 이건 현재 Ai에 위치를 세팅하는 코드입니다.

 

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/GameFramework/APlayerState/GetPawn?application_version=5.2

 

GetPawn

Overload list

dev.epicgames.com

 

 

▣ Blackboard에 동일한 Vector 값을 추가합니다. 

 

 

 

▣ Behavior Tree로 가서 Sequence를 먼저 추가하고 Move to와 Wait Tasks를 추가하여 연결합니다. 

말 그래도 Move to 이동, Wait 대기하는 노드입니다.

그리고 Tasks에 Move To는 PlayerLocation과 DefaultLocation로 각각 이동할 위치를 지정합니다.

그럼 Sequence에 기준으로 왼쪽부터 1,2,3,4 이렇게 반복해서 Tasks가 실행됩니다. 

 

 

 

▣ Move To Task 설정 설명

아래는 이미지에 있는 각 옵션의 상세 설명입니다:

📌 Node 섹션

옵션설명
Acceptable Radius 목표 위치에 얼마나 가까이 접근하면 "도착"했다고 간주할지의 거리 (단위: cm)
Filter Class 도달 목표에 특정 클래스를 필터링할 경우 사용 (보통은 사용 안 함)
Allow Strafe 이동 시 캐릭터가 옆걸음(strafe) 가능한지 여부
Reach Test Includes Agent Radius 도착 판정 시 AI의 반지름 포함 여부 (충돌 크기 포함)
Reach Test Includes Goal Radius 도착 판정 시 목표 객체의 반지름 포함 여부
Stop on Overlap 목표에 겹치면 이동을 중단할지 여부 (플레이어와 겹치면 멈추는 동작 등)
 

📌 Advanced 섹션

옵션설명
Allow Partial Path 완전한 경로가 없어도 가능한 경로만큼 가게 함 (ex. 막다른 길까지라도)
Track Moving Goal ✅ 매우 중요 목표가 움직이면 그 목표를 계속 추적할 것인지 결정하는 핵심 옵션
Require Navigable End Location 도달 지점이 네비게이션 가능한 위치인지 요구
Project Goal Location 목적 위치가 NavMesh 밖이면 자동으로 NavMesh 상의 가장 가까운 위치로 보정

 

▣ Observe Blackboard Value 설명
이 옵션은 Blackboard의 해당 Key 값이 변경될 때마다 이 Task를 다시 실행하도록 설정하는 기능입니다.


즉, 예를 들어 TargetLocation 키가 계속 바뀌는 경우:
이 옵션을 켜두면, AI가 이동 도중에도 값이 바뀌면 즉시 이동 명령이 재실행됩니다.
Track Moving Goal과 비슷한 역할이지만, 이것은 Blackboard 값 자체의 변경을 트리거로 봅니다.
📌 기본적으로 움직이는 타겟을 계속 쫓아가려면 켜도 되고,
Track Moving Goal이 활성화되어 있다면 이건 굳이 켜지 않아도 작동합니다.

 

▣ Observed Blackboard Value Tolerance 설명
이건 Vector 값의 변화 허용 오차입니다.
항목 설명
기본값: 0.0 값이 미세하게 바뀌어도 즉시 반응 (민감함)
지금 값: 4.75 최소 4.75cm 이상 이동해야 Blackboard 값이 바뀌었다고 판단함
즉, TargetLocation이 조금씩 흔들리는 상황 (ex. 플레이어가 살짝 움직일 때)을 방지하기 위해
너무 자주 재시작되는 걸 방지하기 위한 필터입니다.

 

 

 

▣ 저장 후 플레이를 해보면 ai가 계속 이동하는 걸 확인할 수 있습니다. 

728x90
반응형

댓글