비헤이비어 트리의 기본 이해
지금까지 플레이어 캐릭터의 움직임과 상호작용, 그리고 UI 개발에 대해 다루었습니다. 하지만 게임 세계는 플레이어만으로 채워지지 않습니다. 플레이어와 상호작용하고, 게임 세계에 생명력을 불어넣는 것이 바로 인공지능(AI) 캐릭터입니다. 언리얼 엔진은 복잡한 AI 동작을 효율적으로 설계하고 구현할 수 있도록 비헤이비어 트리(Behavior Tree) 라는 강력한 도구를 제공합니다.
이번 장에서는 언리얼 엔진의 AI 시스템을 구축하는 핵심 요소인 비헤이비어 트리에 대해 자세히 알아보겠습니다.
AI 시스템과 비헤이비어 트리란 무엇인가?
AI 시스템(AI System) 은 게임 내에서 플레이어가 아닌 캐릭터(NPC: Non-Player Character)가 마치 지능을 가진 것처럼 행동하도록 만드는 모든 로직과 기술을 포함합니다. NPC는 단순히 정해진 경로를 이동하는 것부터, 플레이어를 추적하고 공격하며, 전술적으로 움직이는 등 다양한 행동을 보여줄 수 있습니다.
비헤이비어 트리(Behavior Tree) 는 이러한 NPC의 복잡한 의사결정 및 행동 패턴을 계층적인 트리 구조로 시각적으로 표현하고 관리하는 도구입니다. 마치 순서도나 의사결정 트리처럼, NPC가 특정 상황에서 어떤 행동을 할지, 그리고 그 행동의 우선순위와 조건은 무엇인지를 정의합니다.
비헤이비어 트리가 필요한 이유
- 복잡성 관리: 다양한 행동과 조건이 얽혀 있는 AI 로직을 이해하기 쉬운 트리 형태로 구성할 수 있어, 복잡한 AI 시스템을 효율적으로 관리할 수 있습니다.
- 시각적 설계: 직관적인 노드 기반 에디터에서 AI의 흐름을 시각적으로 설계하고 디버깅할 수 있습니다. 이는 특히 대규모 프로젝트나 팀 작업에서 AI 디자이너와 프로그래머 간의 협업을 용이하게 합니다.
- 유연성과 확장성: 새로운 행동이나 조건을 쉽게 추가하거나 수정할 수 있어 AI의 동작을 빠르게 변경하고 확장할 수 있습니다.
- 재사용성: 잘 설계된 서브트리(Sub-tree)는 여러 AI 캐릭터에 재사용될 수 있습니다.
비헤이비어 트리의 핵심 구성 요소
비헤이비어 트리는 여러 종류의 노드들이 계층적으로 연결되어 NPC의 행동을 지시합니다. 주요 노드 유형은 다음과 같습니다.
루트 노드 (Root Node)
- 비헤이비어 트리의 최상위 노드이자 시작점입니다. 모든 비헤이비어 트리는 이 노드에서 시작됩니다.
컴포지트 노드 (Composite Nodes)
- 여러 자식 노드들의 실행 흐름을 제어하는 부모 노드입니다. 비헤이비어 트리의 의사결정 구조를 만듭니다.
- 셀렉터 (Selector)
- 자식 노드들을 왼쪽에서 오른쪽 순서로 실행하며, 성공(Succeed) 하는 첫 번째 자식 노드를 찾습니다.
- 자식 노드가 성공하면 셀렉터도 성공하고, 나머지 자식 노드들은 실행되지 않습니다.
- 모든 자식 노드가 실패하면 셀렉터도 실패합니다.
- 활용: "플레이어가 보이는가? (True: 공격) -> 아이템이 근처에 있는가? (True: 획득) -> 아니면 순찰"과 같이 여러 대안 중 하나를 선택할 때 사용합니다. 높은 우선순위의 행동부터 검사합니다.
- 시퀀스 (Sequence)
- 자식 노드들을 왼쪽에서 오른쪽 순서로 실행하며, 실패(Fail) 하는 첫 번째 자식 노드를 찾습니다.
- 자식 노드가 실패하면 시퀀스도 실패하고, 나머지 자식 노드들은 실행되지 않습니다.
- 모든 자식 노드가 성공하면 시퀀스도 성공합니다.
- 활용: "플레이어에게 접근 -> 공격 애니메이션 재생 -> 데미지 적용"과 같이 여러 단계를 순차적으로 모두 성공해야 하는 행동에 사용합니다.
데코레이터 노드 (Decorator Nodes / Condition Nodes)
- 자신이 붙어있는 자식 노드의 실행을 허용할지 말지 조건을 검사하는 노드입니다. 조건이 충족되지 않으면 해당 자식 노드와 그 하위 트리는 실행되지 않습니다.
- 트리의 특정 부분에 특정 조건을 적용할 수 있습니다.
- 활용: "플레이어가 사정거리 안에 있는가?", "체력이 충분한가?", "쿨다운이 끝났는가?" 등의 조건을 설정합니다.
서비스 노드 (Service Nodes)
- 특정 시간 간격으로 실행되거나, 트리 분기를 따라 들어갈 때마다 실행되어 지속적으로 정보를 업데이트하거나 조건을 검사하는 노드입니다. 특정 컴포지트 노드에 붙어 그 하위 트리 전체에 영향을 미칩니다.
- 활용: "주기적으로 플레이어의 위치를 감지하여 블랙보드에 업데이트", "주기적으로 체력을 검사하여 전투 상태 전환 결정" 등의 용도로 사용합니다.
태스크 노드 (Task Nodes)
- 비헤이비어 트리의 가장 말단에 위치하며, NPC가 실제로 수행할 하나의 구체적인 행동을 정의합니다. (예:
Move To
,Play Animation
,Attack
,Wait
등) - 태스크는 성공(Succeed) 또는 실패(Fail)를 반환하며, 이는 부모 컴포지트 노드의 흐름 제어에 영향을 미칩니다.
- 활용: "목표 위치로 이동", "공격 애니메이션 재생", "잠시 대기" 등입니다.
비헤이비어 트리와 블랙보드(Blackboard)
비헤이비어 트리는 AI의 '두뇌' 역할을 하지만, 실제 게임플레이 데이터(플레이어의 위치, NPC의 체력, 현재 목표 등)를 직접 저장하지는 않습니다. 이러한 데이터는 블랙보드(Blackboard) 라는 별도의 데이터 저장소에 저장되며, 비헤이비어 트리의 노드들은 이 블랙보드에서 필요한 정보를 읽거나 씁니다.
- 블랙보드(Blackboard): AI가 의사결정을 내리고 행동을 수행하는 데 필요한 모든 데이터(Key-Value 쌍)를 저장하는 공유 메모리 공간입니다.
- 활용: AI 캐릭터의
TargetLocation
,TargetActor
,IsAggro
,CurrentHealth
등의 변수를 블랙보드 키로 설정하고, 비헤이비어 트리의 서비스, 데코레이터, 태스크 노드에서 이 키의 값을 사용하거나 변경합니다.
비헤이비어 트리 생성 및 기본 설정
비헤이비어 트리 생성
- 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 >
인공지능(Artificial Intelligence)
>비헤이비어 트리(Behavior Tree)
를 선택합니다. - 이름을 지정합니다. (예:
BT_EnemyAI
)
블랙보드 에셋 생성
BT_EnemyAI
비헤이비어 트리를 생성할 때, 함께 사용할 블랙보드를 생성할지 묻는 대화 상자가 나타납니다.블랙보드 생성(Create New Blackboard)
을 선택합니다.- 이름을 지정합니다. (예:
BB_EnemyAI
)
비헤이비어 트리에 블랙보드 연결
BT_EnemyAI
비헤이비어 트리 에디터를 엽니다.- 상단의
블랙보드(Blackboard)
드롭다운 메뉴에서BB_EnemyAI
를 선택하여 연결합니다.
AI 컨트롤러에 비헤이비어 트리 실행 로직 추가
- 새로운 AI 컨트롤러(AI Controller) 블루프린트를 생성합니다. (예:
AIC_Enemy
) AIC_Enemy
에디터를 엽니다.Event BeginPlay
뒤에Run Behavior Tree
노드를 추가합니다.BTAsset
핀에 여러분이 만든BT_EnemyAI
를 연결합니다.- 컴파일 및 저장합니다.
NPC 폰(Pawn)에 AI 컨트롤러 연결
- 여러분의 NPC 폰 블루프린트(예:
BP_EnemyCharacter
)를 엽니다. - 디테일 패널에서
폰(Pawn)
섹션의AI 컨트롤러 클래스(AI Controller Class)
를AIC_Enemy
로 설정합니다. - 컴파일 및 저장합니다.
이제 BP_EnemyCharacter
가 스폰되면 자동으로 AIC_Enemy
가 컨트롤하고, 이 컨트롤러가 BT_EnemyAI
를 실행하여 NPC의 행동을 제어하게 됩니다.
비헤이비어 트리는 언리얼 엔진에서 복잡한 AI를 구현하는 가장 강력하고 권장되는 방법입니다. 다음 절에서는 이 비헤이비어 트리와 블랙보드를 이용한 기본적인 AI 행동 구현 방법을 구체적인 예시와 함께 다루겠습니다.
이번 절에서는 언리얼 엔진 AI 시스템의 핵심인 비헤이비어 트리의 기본 개념과 블랙보드와의 관계, 그리고 기본적인 설정 방법에 대해 알아보았습니다. 비헤이비어 트리는 복잡한 AI 로직을 시각적이고 체계적으로 관리하는 데 필수적인 도구입니다.