목차
1. Behavior Tree(비헤이비어 트리)
2. Black Board(블랙보드)
3. AI Controller
4. NavMesh
1. Behavior Tree (비헤이비어 트리)
비헤이비어 트리는 AI의 행동을 결정하는 계층적 구조를 가진 트리. 각 노드(Node)에는 특정 역할이 있으며, AI는 루트(Root) 노드에서 시작하여 조건에 따라 적절한 행동을 수행.
1-1. 비헤이비어 트리의 주요 노드 유형
- Root 노드: 트리의 시작점
- Composite 노드 (합성 노드): 여러 개의 하위 노드를 가질 수 있음
- Selector (선택자): 왼쪽부터 실행하며, 성공하는 노드를 찾으면 중단
- Sequence (시퀀스): 왼쪽부터 순서대로 실행하며, 하나라도 실패하면 중단
- Decorator 노드 (데코레이터 노드): 특정 조건을 검사하여 실행 여부를 결정
- Task 노드 (태스크 노드): AI가 수행할 실제 동작 (ex. 이동, 공격)
2. Blackboard (블랙보드)
AI가 정보를 저장하고 공유하는 데이터 저장소.
비헤이비어 트리와 함께 사용되며, AI의 의사 결정에 필요한 변수(위치, 상태 등)를 관리.
2-1 블랙보드의 주요 기능
- 키(Key) 시스템: 데이터 항목을 저장하는 변수 (ex. TargetLocation, HasEnemy)
- AI가 환경 정보를 저장하고 활용 가능
- 비헤이비어 트리 내에서 데코레이터 또는 태스크 노드를 통해 활용
3. AI Controller (AI 컨트롤러)
- AI 캐릭터를 제어하는 핵심 클래스
- AI가 어떤 논리를 따라야 하는지 결정하고, Behavior Tree를 실행하는 관리자.
- 예: AI의 상태(Idle, Chase 등) 전환 관리
3-1. AIController의 주요 역할
- 비헤이비어 트리 및 블랙보드 초기화
- AI 이동 및 감지 기능 (Perception System)
- Pawn(캐릭터) 제어 및 명령 전달
3-2. AI Controller 설정 과정
- AIController 클래스를 생성하고 AController를 상속
- UseBlackboard() 함수로 블랙보드를 초기화
- RunBehaviorTree() 함수로 비헤이비어 트리 실행
- Possess() 함수를 오버라이드하여 AI 캐릭터를 제어
#include "MyAIController.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "BehaviorTree/BehaviorTree.h"
void AMyAIController::BeginPlay()
{
Super::BeginPlay();
if (UseBlackboard(BlackboardAsset, Blackboard))
{
RunBehaviorTree(BehaviorTree);
// 블랙보드에 초기 목표 위치 설정
FVector RandomLocation(1000.0f, 500.0f, 0.0f);
Blackboard->SetValueAsVector(TEXT("PatrolLocation"), RandomLocation);
}
}
4. NavMesh (내비게이션 메시)
- AI가 이동할 수 있는 경로를 결정하는 내비게이션 시스템.
4-1. NavMesh 설정 방법
- NavMesh Bounds Volume 추가
- Modes 패널에서 Nav Mesh Bounds Volume을 배치
- AI가 이동할 수 있는 영역을 지정
- RecastNavMesh 확인
- World Settings에서 RecastNavMesh 활성화
- AI 이동을 위한 Pathfinding
- GetNavAgentLocation() 및 FindPathToLocation() 등의 함수를 사용 가능
4-2. AI가 NavMesh를 활용해 이동하는 코드 예제
UNavigationSystemV1* NavSys = FNavigationSystem::GetCurrent<UNavigationSystemV1>(this);
FNavLocation NavLocation;
if (NavSys->GetRandomPointInNavigableRadius(GetActorLocation(), 500.0f, NavLocation))
{
MoveToLocation(NavLocation.Location);
}
AI가 500 유닛 반경 내에서 랜덤한 위치를 찾아 이동하는 방식.
'TIL > C++와 UE' 카테고리의 다른 글
머티리얼 조작 (0) | 2025.02.25 |
---|---|
Enemy(Monster) 클래스 (0) | 2025.02.24 |
파티클 시스템 (0) | 2025.02.11 |
게임 메뉴 UI 디자인 (0) | 2025.02.07 |
Pawn 클래스 캐릭터의 부드러운 움직임 (1) | 2025.02.05 |