게임 개발에서의 인공지능 행동 트리: Unreal Engine 5 및 Unity 프레임워크 기반의 선택자, 순차 및 데코레이터 노드 구조에 대한 포괄적 분석
비디오 게임에서 인공지능 시스템의 진화는 단순 결정론적 규칙 세트에서 동적이고 모듈화되며 맥락 인식적인 결정 메커니즘으로 나아가는 근본적인 패러다임의 변화를 반영합니다. 이 진화의 중심에는 "행동 트리"(Behavior Trees - BT)로 알려진 수학적 및 논리적 계획 모델이 자리 잡고 있습니다. 원래 로보틱스와 제어 시스템을 위해 개발되었으며, 특히 로드니 브룩스의 계층적 제어 시스템 아키텍처에서 영감을 받은 이 구조들은 헤일로, 바이오쇼크, 스포어와 같은 대형 프로젝트를 통해 게임 산업에서 그 진가를 입증했습니다. 1 오늘날에는 Unreal Engine 5 및 Unity와 같은 현대 게임 엔진의 핵심 인공지능 구성 요소 역할을 하고 있습니다. 이 보고서는 행동 트리의 기본 뼈대를 이루는 선택자(Selector), 순차(Sequence), 데코레이터(Decorator) 노드와 이러한 노드 이면의 이론적 논리, 유한 상태 머신(FSM)에 대한 장점, 수학적 작동 메커니즘, 그리고 현대 엔진 아키텍처에서의 구체적인 구현을 포괄적으로 검토합니다.
행동 트리의 이론적 및 수학적 기초
행동 트리는 컴퓨터 과학, 로보틱스 및 비디오 게임에서 계획 실행을 모델링하는 방향성(directed) 및 계층적 구조의 수학적 트리 모델입니다. 1 계층적 트리 구조로 설계된 이 모델은 루트(root) 노드에서 시작하여 내부 노드(복합 노드)를 거쳐 리프(leaf/task) 노드로 향하는 실행 흐름을 가집니다. 3 시스템의 가장 기본적인 아키텍처적 특징은 각 노드가 처리 순서(tick)가 되었을 때 특정한 논리적 연산을 수행한 후, 자신을 호출한 부모 노드에 특정 처리 상태(status)를 반환한다는 점입니다. 3 이러한 반환 상태는 보편적으로 세 가지 주요 카테고리로 분류됩니다:
성공 (Success): 노드가 정의된 작업 또는 논리적 제어를 문제없이 완벽하게 수행하고 완료했음을 나타냅니다. 3
실패 (Failure): 노드가 정의된 작업을 수행하지 못했거나, 장애물에 부딪혔거나, 조건이 충족되지 않았음을 나타냅니다. 3
실행 중 (Running): 작업이 아직 종료되지 않았으며, 진행 중이고 다음 처리 주기(tick)에서 다시 평가되어야 함을 나타냅니다. 3
기존의 결정 트리(Decision Trees) 및 단순한 if-else 블록과 달리 "실행 중"(Running) 상태의 존재는 행동 트리가 단일 처리 주기(frame/tick)보다 더 오랜 시간 동안 작업을 중단 없이 실행할 수 있도록 하며, 시스템을 멈춤 현상으로부터 보호하는 반응형 구조를 갖추게 합니다. 5 게임 개발에서 인공지능 에이전트가 A 지점에서 B 지점으로 이동하는 데는 대개 수초가 소요되며, 이 과정 동안 실행되는 리프 노드가 지속적으로 "실행 중" 상태를 반환하여 부모 노드가 대기(Waiting) 상태를 유지하도록 합니다. 4 이러한 비동기적 작동은 엔진의 메인 파이프라인이 차단되는 것을 방지합니다.
패러다임 비교: 유한 상태 머신(FSM)과 행동 트리는(BT)

행동 트리가 게임 산업의 표준이 된 진정한 이유는 유한 상태 머신(Finite State Machines - FSM)이 가져오는 아키텍처적 난제를 해결하기 때문입니다. FSM은 각 상태(State) 간의 전환(Transitions)을 미리 정의된 인접 그래프(adjacency graph)를 통해 관리합니다. 2 상태 수가 적을 때는 구축하기 쉽고 완벽하게 작동하는 FSM이지만, 상태 수가 증가함에 따라 전환 조합이 기하급수적으로 늘어나기 때문에 통제할 수 없는 "스파게티 코드" 혼란으로 바뀝니다. 7 이와 대조적으로 행동 트리는 계층적 구조 덕분에 매우 복잡한 작업을 단순한 작업들의 조합(컴포지션)으로 생성합니다. 1 하위 작업이 어떻게 구현되는지는 상위 노드에 블랙박스(black box) 역할을 합니다. 1 반응형 구조 덕분에 외부 자극이나 고위 우선순위의 상태 변화가 있을 때 트리는 루트부터 시작하거나 특정 이벤트 리스너(observers)를 통해 스스로를 재평가하여 기존 작업을 취소하고 상황에 맞는 새로운 분기를 활성화할 수 있습니다. 5 FSM에서는 전환이 상태 자체의 내부나 별도의 관리자 클래스에 코딩되어야 하는 반면, 행동 트리에서는 제어 흐름과 작업 실행이 완전히 분리되어 있습니다. 2
분석 지표 | 행동 트리 (Behavior Trees) | 유한 상태 머신 (FSM / HFSM) |
|---|---|---|
아키텍처 구조 | 계층적, 부모/자식(parent/child) 관계 기반, 하향식 흐름. | 인접 그래프(adjacency graph) 및 노드 간 엣지 전환. |
확장성 | 높은 모듈화; 서브 트리는 독립적으로 테스트 가능하며, 그래프가 커질수록 복잡도가 선형적으로 증가. | 복잡도가 증가함에 따라 전환 관리가 기하급수적으로 어려워짐 ( 위험). |
실행 로직 | 작업 기반 (Task-based). 노드는 매 틱이나 이벤트마다 동적으로 상향식 평가됨. | 상태 기반 (State-based). 활성 상태는 특정 전환 조건이 충족될 때까지 유지됨. |
반응성 | 우선순위가 높은 작업을 위한 즉각적인 중단(abort) 및 리다이렉션 메커니즘 제공. | 현재 상태에서 새 상태로 전환하기 위한 명시적(explicit) 규칙, 종료 및 진입 함수 필요. |
메모리 관리 | 이전 결정이 트리 형태로 저장되지 않으며, 시스템은 매번 루트 또는 현재 노드에서 작동함 (무상태 반응성). | 이전 작업과 결정이 현재 상태에 명시적 메모리(memory)를 생성함 (높은 표현력). |
표 1: 인공지능 시스템에서의 행동 트리와 유한 상태 머신의 구조적, 알고리즘적, 운영적 비교. 이 표는 두 패러다임의 아키텍처적 차이점과 사용 사례를 요약합니다. 1
연구자들은 BT를 결정 트리, 텔레오 반응형 프로그램 및 FSM과 비교했을 때, FSM이 내부 변수와 이전 결정에 액세스할 수 있는 상태를 구축할 수 있어 더 "표현력(expressive)"이 있는 반면, BT는 모든 새로운 입력이나 틱에서 실행을 루트부터 시작하거나(또는 이벤트로 중단하기) 때문에 훨씬 더 "반응형(reactive)"이고 가독성이 높다는 것을 증명했습니다. 5 게임 개발자들은 BT의 이러한 무상태성이지만 즉각적으로 반응하는 구조를 블랙보드(Blackboard)라는 데이터 저장 유닛으로 보완하여 메모리 부족 문제를 해결하고 완벽한 하이브리드 데이터-로직 분리를 달성했습니다. 12
흐름 제어의 중심지: 복합 노드 (Composite Nodes)
행동 트리에서 결정 메커니즘과 논리적 흐름의 심장부는 "복합 노드"(Composite Nodes)가 담당합니다. 복합 노드는 자신에게 연결된 하나 이상의 자식(child) 노드를 가질 수 있으며, 이 자식들이 어떤 순서로, 어떤 우선순위 규칙에 따라, 또는 어떤 논리적 조건에 따라 실행될지를 결정하는 주요 뼈대 구조입니다. 3 흐름 기하학은 보편적으로 위에서 아래로(부모에서 자식으로), 왼쪽에서 오른쪽으로(우선순위 분기에서 부차적 분기로) 진행됩니다. 10 시스템에서 가장 기본적이고 필수적인 두 가지 복합 노드 모델은 순차(Sequence) 및 선택자(Selector) 노드입니다. 3
순차 노드 (Sequence Node): 논리적 "AND" 흐름
순차 노드는 자신에게 연결된 하위 노드들을 가장 왼쪽의 자식부터 시작하여 오른쪽으로 연속적이고 엄격한 규칙에 따라 실행하는 빌딩 블록입니다. 작동 논리상 순차 노드는 프로그래밍 아키텍처의 논리적 "AND" 게이트로 모델링될 수 있습니다. 3 노드가 작업을 성공적으로 완료한 것으로 간주되려면 체인 내의 각 자식 노드가 실행되어 예외 없이 "성공"(Success) 상태를 반환해야 합니다. 3 체인의 어느 지점에서든 자식 노드가 "실패"(Failure)를 반환하면, 순차 노드는 즉시 그 지점에서 실행을 중단하고 오른쪽에 남아 있는 다른 자식들의 실행을 포기하며 자신의 부모에게 "실패" 상태를 전달합니다. 3
자식 노드 중 하나가 실행 중에 "실행 중"(Running) 상태를 반환하는 동안, 순차 노드는 진행을 멈추고 자신의 부모에게 "실행 중" 상태를 계속 전달합니다. 3 다음 시스템 틱에서 순차 노드는 현재 실행 중인 해당 자식 노드부터 실행을 재개하며, 처음부터 다시 시작하지 않습니다.
수학적으로 순차 노드의 상태 S는 자식 노드들의 상태가 각각 일 때 다음과 같은 방정식으로 표현될 수 있습니다:

게임 개발 과정에서 순차 노드는 서로 절대적으로 의존하며 연대순으로 발생해야 하는 복잡한 작업 세트를 모델링하기 위한 훌륭한 도구입니다. 고전적인 "문 열기" 작업을 예로 들면, 인공지능이 문을 여는 작업은 "문을 향해 걷기", "문 잠금 해제하기", "문 손잡이를 돌려 밀기" 형태의 세 가지 별도 리프 노드로 구성된 Sequence 분기 아래에 모을 수 있습니다. 10 캐릭터가 첫 단계에서 길을 찾지 못해 문 옆에 가지 못하는 경우(내비게이션 오류 - Failure), 전체 작업 시퀀스는 실패로 끝납니다. 캐릭터가 문 옆에 없을 때 시스템이 "잠금 해제" 명령을 실행하는 것은 비합리적이기 때문에, 순차 노드는 이 오류를 즉시 감지하여 체인을 끊고 중앙 처리 장치(CPU) 주기를 절약합니다. 13 유사하게 적 에이전트가 플레이어를 공격하기 위해 구축된 Sequence 분기는 "플레이어를 향해 전진", "사거리 내에 있는지 확인", "플레이어 바라보기", "공격 애니메이션 재생"으로 설계됩니다. 사거리 확인에 실패하면 회전 및 공격 작업은 결코 실행되지 않습니다. 14
선택자 노드 (Selector / Fallback Node): 논리적 "OR" 흐름

선택자 노드(일부 엔진에서는 Fallback으로도 알려짐)는 순차 노드와 정확히 반대되는 철학으로, 유연한 문제 해결사이자 논리적 "OR" 게이트처럼 작동합니다. 3 이 노드는 하위의 자식 노드들을 다시 왼쪽에서 오른쪽으로 계층 구조를 이루며 시도하지만, 자식 노드가 "성공"(Success)하는 순간 다른 대안 평가를 중단하고 부모에게 즉시 "성공"(Success)을 반환합니다. 3 선택자 노드가 실패한 것으로 간주되려면 하위의 모든 자식 노드가 예외 없이 시도되어 전부 "실패"(Failure)해야 합니다. 3
순차 노드와 마찬가지로 실행 중인 자식이 "실행 중"을 반환하면 선택자 노드도 일시 중단되며 "실행 중" 상태를 부모에게 반영합니다.
수학적 정의는 다음과 같습니다:

게임 디자인에서 이 구조는 인공지능이 단일한 일반 목적이나 목표를 달성하기 위해 우선순위가 매겨진 다양한 경로, 전술 또는 반응을 시도하도록 보장하는 데 사용됩니다. 왼쪽은 항상 가장 높은 우선순위를 나타내므로 디자인 관행상 가장 선호되는, 비용이 가장 적게 드는 또는 가장 최적의 작업이 맨 왼쪽에 배치되는 반면, 오른쪽으로 갈수록 대체되고 비용이 더 많이 들며 덜 이상적인 솔루션이 제공됩니다. 3 이 상황은 트리 아키텍처에서 강력한 우선순위(priority) 계층화를 생성합니다. 3
이를 설명하기 위해 문 열기 시나리오를 확장해 보겠습니다. 캐릭터는 문의 반대편으로 이동해야 합니다. 선택자 노드 아래에 세 가지 다른 작업 또는 서브 트리(Sequence)를 정렬할 수 있습니다. 맨 왼쪽에는 "열쇠 사용", 중앙에는 "따기로 잠금 해제"(더 느림), 맨 오른쪽에는 "문 부수고 열기"(시끄럽고 위험함) 작업이 있습니다. 10 에이전트 인벤토리에 열쇠가 있으면 첫 번째 작업이 시도되어 성공합니다. 선택자 노드는 다른 모든 처리를 취소하고 문을 통과하게 됩니다. 그러나 에이전트에 열쇠가 없는 경우(Failure), 선택자 노드는 포기하지 않고 바로 오른쪽에 있는 "따기 사용" 옵션으로 이동합니다. 그것도 실패하면 최후의 수단으로 문을 부수는 것을 시도합니다. 세 가지 작업 모두(예: 문이 부술 수 없는 강철 문인 경우) 실패하는 경우에만 선택자 노드는 부모에게 모든 대안이 소진되었음을(Failure) 보고합니다. 10 이 우선순위 기반 OR 아키텍처는 선택자 노드가 매우 정교하고 자연스럽게 느껴지는 인공지능 행동을 생성하는 데 있어 진정한 힘을 반영합니다.
실행 조작: 데코레이터(Decorator) 노드
복합 노드가 자식 노드의 순서와 실행 로직을 구성하는 반면, 데코레이터 노드는 트리 내부의 제어 메커니즘을 세밀하게 조정하는 역할을 합니다. 소프트웨어 공학의 "데코레이터" 디자인 패턴과 같은 이름을 가진 이 구조는 복합 노드와 달리 단 하나의 자식 노드(또는 하위 트리)만 가질 수 있으며, 이 자식의 실행 규칙, 반환 결과 또는 반복 메커니즘을 외부에서 갑옷처럼 감싸 조작합니다.3 데코레이터는 특정 분기의 실행 여부를 결정하는 조건부 장벽(Conditionals) 또는 가드 노드(Guard Nodes)로 기능합니다.15
데코레이터의 주요 기능 및 사용 시나리오
게임 AI에서 데코레이터의 가장 흔하고 중요한 용도는 조건 검사(Conditionals)입니다.4 AI 트리의 한 분기는 데코레이터가 정의한 조건이 충족될 때만 접근할 수 있습니다. 예를 들어, 적을 공격하려는 "공격" 분기 앞에 배치된 데코레이터는 "적군이 시야에 있는가?" 또는 "무기가 장전되었는가?"와 같은 검사를 지속적으로 수행합니다.3 만약 조건이 유효하지 않으면, 데코레이터는 자식 노드의 실행을 즉시 차단하고 "실패"(Failure) 상태를 반환합니다.4
조건 외에도 데코레이터는 흐름의 결과를 직접 수정하거나 작업을 특정 타임라인에 연결하는 변형들을 포함합니다 4:
Inverter (반전기): 논리 "NOT" 게이트처럼 작동합니다. 자식 노드가 실패하면 부모에게 "성공"을 반환하고, 자식이 성공하면 "실패"를 반환합니다.4 특정 상황이 발생하지 않기를 원할 때(예: "적이 근처에 없으면 순찰하라") 사용됩니다.
Succeeder (강제 성공): 자식의 결과가 무엇이든, 심지어 실패하더라도 부모 노드에 강제로 "성공"을 반환합니다.4 이는 거대한 Sequence 체인 내에서 실패해도 무방한 선택적 작업(예: "적에게 소리치기")이 전체 체인을 끊지 않도록 할 때 사용됩니다.18
Repeat (루프 / 반복): 특정 노드나 분기를 정해진 횟수만큼, 무한히, 또는 성공/실패할 때까지 반복해서 실행하게 합니다.4
Cooldown 및 Time Out (시간 제한): Cooldown은 분기의 연속된 두 실행 사이에 강제 대기 시간을 추가합니다(예: 스킬 재사용 대기 시간). Time Out은 오래 걸리는 작업(Running)이 특정 시간이 지나면 강제로 실패 처리되어 취소되도록 합니다.4
Unreal Engine 5: 이벤트 기반 행동 트리 아키텍처
Unreal Engine 5(UE5)는 업계 표준인 행동 트리 구현을 독자적이고 고성능이며 복잡한 아키텍처 수정과 함께 제공합니다. 이러한 수정 중 가장 깊고 중요한 것은 UE5의 행동 트리가 완전히 "이벤트 기반"(Event-Driven) 아키텍처 위에서 작동한다는 점입니다.16 고전적인 행동 트리에서 시스템은 작업의 유효성을 테스트하기 위해 매 프레임(frame/tick)마다 트리 전체를 루트부터 잎 노드까지 계속해서 재평가합니다. 이러한 "폴링"(polling) 기반 접근 방식은 수백 명의 적이 있는 게임에서 CPU 성능에 엄청난 부하를 줍니다.19
Unreal Engine 문서에 따르면, 엔진 내의 행동 트리는 이러한 불필요한 연산 부하를 피하기 위해 수동적 대기 모드에서 작동합니다. 시스템은 매 프레임 조건을 확인하는 대신, Blackboard(블랙보드)의 변수 변경에 의해 트리거되는 "이벤트"(events)를 기다리며, 관련 변수가 변경될 때만 트리의 필요한 분기를 열거나 닫거나 재평가합니다.16
UE5에서 AI 프로필은 기본적으로 AI 두뇌를 관리하는 AI Controller, 기억과 변수를 저장하는 데이터베이스 Blackboard, 결정 로직을 그리는 Behavior Tree, 작업을 수행하는 Tasks, 상태를 필터링하는 Decorators, 데이터를 업데이트하는 Services 구성 요소로 이루어집니다.12 Blackboard(블랙보드)는 캐릭터의 목표, 현재 위치, 시야 내의 적 또는 순찰 지점과 같은 맥락 데이터를 저장하며 행동 트리와 완전히 독립적으로 존재하는 데이터 클래스입니다.12 행동 트리는 단순한 로직 프로세서일 뿐이며, Blackboard에서 데이터를 가져와 결정을 내리고 작업(Task)을 실행합니다.19
UE5의 복합 노드: Selector, Sequence 및 Simple Parallel
UE5 인터페이스에서 "Selector" 노드는 하위 트리(subtrees) 간의 전술적 전환을 위해 사용되며, "Sequence" 노드는 일련의 하위 작업을 순차적으로 실행하는 데 사용됩니다.12 UE5는 기존 시스템에 존재하는 복잡한 Parallel(병렬) 노드 대신, 사용 편의성과 안정성을 위해 "Simple Parallel"(단순 병렬) 노드를 사용합니다.14 단순 병렬 노드는 정확히 두 개의 연결을 가집니다: "메인 작업"(Main Task)과 "배경 분기"(Background Branch). 메인 작업은 항상 잎 노드(Task)여야 합니다. 에이전트가 메인 작업을 수행하는 동안(예: "적에게 사격"), 배경 분기가 동시에 실행됩니다(예: "지속적으로 적에게서 멀어지기"). 메인 작업이 끝나거나 배경 작업이 끝났을 때 노드가 어떻게 반응할지는 설정에서 구성할 수 있습니다.14
시스템의 심장: 관찰자 중단(Observer Aborts) 메커니즘
Unreal Engine 5의 행동 트리 시스템을 독보적으로 만들고 게임 내 AI가 "살아있는" 것처럼 느끼게 하는 가장 핵심적인 기능은 데코레이터 내부에 하드웨어 수준으로 통합된 "관찰자 중단"(Observer Aborts) 메커니즘입니다.21 AI 에이전트는 특정 외부 상황(예: 적이 시야에서 사라짐)을 평가하기 위해 트리의 루트로 돌아가 모든 분기를 다시 순회할 필요가 없습니다. 대신 데코레이터가 Blackboard 변수를 수동적으로 관찰(observe)합니다.17
조건이 변경될 때 시스템이 분기를 어떻게 끊을지 결정하는 Observer Aborts 기능은 개발자에게 네 가지 매개변수를 제공합니다 22:
Observer Abort 모드 | 기능 설명 및 운영 효과 |
|---|---|
None (없음) | 관찰이 발생하더라도 즉각적인 중단(interrupt)은 수행되지 않습니다. 트리는 정상적인 흐름에 따라 데코레이터에 계층적 순서가 올 때 조건을 평가합니다. 우선순위가 높은 이벤트가 발생해도 우선순위가 낮은 작업을 중단시킬 수 없습니다. |
Self (자신) | 데코레이터가 연결된 노드와 해당 노드 하위의 트리만 포함합니다. 실행이 이미 이 분기 내에 있을 때 조건이 갑자기 유효하지 않게 되면(예: "공격" 분기 중 적이 사거리 밖으로 나감), 분기는 즉시 취소되고 트리는 상위 계층에 "실패" 상태를 보고합니다. |
Lower Priority (낮은 우선순위) | 데코레이터는 자신보다 우선순위가 낮은(자신의 오른쪽에 있는) 분기를 관찰합니다. 에이전트가 오른쪽의 낮은 우선순위 작업을 수행 중일 때(예: 순찰), 이 데코레이터의 조건이 충족되면(예: 적 발견), 시스템은 즉시 오른쪽의 순찰 작업을 취소하고 흐름을 왼쪽(이 분기 내부)으로 가져옵니다. |
Both (둘 다) | "Self"와 "Lower Priority" 기능이 동시에 작동하는 가장 반응적인 모드입니다. 현재 실행 중인 분기의 조건이 깨지면 스스로를 취소하고, 낮은 우선순위 작업 중일 때 자신의 조건이 충족되면 낮은 우선순위를 취소하고 흐름을 가로챕니다. |
표 2: Unreal Engine 5 Observer Aborts 매개변수의 체계적 및 전술적 작동 방식.
분석 시나리오를 통해 설명하자면, 에이전트가 "순찰" 순차 노드를 실행 중일 때(낮은 우선순위, 오른쪽 분기), 플레이어가 에이전트의 시야에 들어오면 Blackboard의 "HasLineOfSight"(시야 확보) 키가 "True"(설정) 상태가 됩니다. 왼쪽 "추격" 분기 시작 부분에 있는 데코레이터가 "Lower Priority" 또는 "Both"로 설정되어 있다면, 시스템은 순찰 Task 노드를(긴 내비게이션 과정 중이라도) 즉시 취소하고 실행을 우선순위가 높은 "추격" 분기로 전환합니다.14 이는 운영 체제의 하드웨어 "인터럽트"(hardware interrupt) 신호가 게임 AI에서 소프트웨어적으로 구현된 것이며, AI가 매우 반응적이고 즉각적인 결정을 내릴 수 있게 합니다. 조건이 다시 깨지면(플레이어가 숨으면) 데코레이터가 "Both" 또는 "Self"로 설정된 경우 "추격" 작업은 즉시 중단되고 시스템은 오른쪽의 순찰 루틴으로 돌아갑니다.14 여러 데코레이터가 낮은 우선순위 작업을 취소하려는 경우, 가장 왼쪽에 있는(가장 높은 우선순위) 데코레이터의 조건이 충족되어야 합니다.22
UE5 아키텍처의 서비스 노드(Service Nodes)
고전적인 행동 트리 개념과 완전히 다르며 UE5에 특화되어 개발된 또 다른 구성 요소는 "Service"(서비스)라고 불리는 특정 노드 유형입니다. 서비스는 잎 노드처럼 작업을 수행하지 않으며, 데코레이터처럼 흐름을 끊지도 않습니다. 오직 복합 노드(Selector/Sequence)에만 추가될 수 있으며, 해당 분기가 실행되는 동안 배경에서 정해진 시간 간격(frequency)으로 계속해서 트리거되는 업데이트 노드입니다.27

개발자들은 대상의 이동 위치를 추적하거나, 플레이어와의 거리를 계산하거나, 환경 변수를 확인하여 Blackboard의 데이터를 정기적으로 업데이트하기 위해 서비스를 사용합니다.19 다른 게임 엔진에서는 이러한 주기적인 데이터 업데이트를 위해 복잡한 병렬 분기(Parallel Nodes)를 만들거나 무거운 C# 코드를 작성해야 하지만, UE5는 이를 트리의 특정 분기에 국한하여 CPU 성능을 놀라울 정도로 최적화합니다. 서비스는 연결된 Sequence나 Selector가 활성화되어 있는 동안 "Tick" 메서드를 실행하며, 해당 분기에서 나가면 종료되어 성능 소모를 멈춥니다.27
Unity 6 Behavior Package (v1.0+): 현대적이고 시각적이며 다재다능한 트리 아키텍처
역사적으로 Unity 엔진을 사용하는 개발자들은 프로젝트의 복잡한 게임 내 AI 솔루션을 위해 NodeCanvas, Behavior Designer 또는 Playmaker와 같은 서드 파티 에셋 플러그인에 의존해야 했습니다.30 그러나 Unity 6000 버전 이후 도입된 공식 "Unity Behavior"(버전 1.0.x) 패키지를 통해 엔진에 통합되고 성능이 최적화되었으며 완전히 이벤트 기반으로 작동하는 공식 시각적 로직 에디터를 갖추게 되었습니다. Unity 엔지니어들은 이 현대적인 구조를 고전적인 행동 트리의 엄격한 계층 구조와 구분하고, 분기가 다시 합쳐질 수 있는(Join nodes) 비선형적이고 훨씬 적응력이 뛰어난 특성을 강조하기 위해 시스템 이름을 "행동 그래프"(Behavior Graphs)라고 명명했습니다. Unity Behavior 시스템은 엔진 깊숙한 곳의 직렬화(serialization) 인프라와 C# 로직에 직접 통합되어 있습니다. UE5와 마찬가지로 데이터 전달 작업은 "Blackboard" 변수를 통해 관리되며, 그래프 로직은 이벤트(event) 기반 트리거로 작동합니다. 시스템에서 노드는 보편적인 기능에 따라 두 가지 주요 그룹으로 나뉩니다: 흐름이 어디로 갈지 결정하는 "흐름 제어"(Control flow) 노드와 구체적인 작업을 수행하는, 보통 회색으로 표시된 "작업"(Action) 노드입니다. 흐름 제어 노드는 다시 순차(Sequencing) 노드와 수정자(Modifier) 노드로 분류됩니다.
Unity의 순차 노드: Sequence 및 Try In Order
Unity 패키지에서 순차 노드는 고전적인 트리의 Sequence 및 Selector 로직을 그대로 수행하지만, 명명 및 기능적 배열 측면에서 다르고 혁신적인 구문을 사용합니다. 기존의 "Selector"(선택자) 노드는 Unity 생태계에서 "Try In Order"(순서대로 시도)라고 불립니다.
Sequence(순차) 노드: 고전적인 로직과 동일하게 작동합니다. 분기를 왼쪽에서 오른쪽으로 순서대로 실행하며, 하나라도 실패하면 흐름을 끊고 Failure를 반환하고, 모두 성공하면 Success를 반환합니다. Unity Behavior 인터페이스의 가장 혁신적인 기능 중 하나는 "암시적 순차"(Implicit Sequence / Stacking) 구조입니다. 시각적 에디터에서 여러 작업 노드를 수직으로 쌓으면(예: 연속으로 세 개의 애니메이션 노드 추가), 시스템은 이를 연결하기 위해 추가적인 Sequence 노드를 필요로 하지 않습니다. 런타임(runtime)에 이 스택 구조는 자동으로 숨겨진 순차 노드로 변환됩니다. 이를 통해 시각적 그래프 복잡성과 "스파게티" 모양이 크게 줄어듭니다.
Try In Order(선택자) 노드: 이름에서 알 수 있듯이 이 노드는 하나의 옵션이 "성공"할 때까지 분기를 왼쪽에서 오른쪽으로 순서대로 시도합니다. 이 맥락에서 고전적인 행동 트리의 "Selector" 또는 "Fallback" 노드와 논리적으로 완전히 동일합니다. 보통 에이전트가 여러 전략 중 "최선의 옵션"을 찾아야 하는 시나리오에서 사용됩니다.
Run In Parallel 및 Random 노드: 연결된 모든 분기를 동시에(병렬로) 실행하거나 자식 중 무작위로 하나를 선택하기 위해 사용되는 흐름 구조입니다. 병렬 실행에서 부모 노드의 로직은 "Wait For All"(모든 분기가 성공적으로 끝날 때까지 대기) 또는 "Wait For Any"(어느 한 분기라도 끝나면 충분함)와 같은 세부 설정으로 구성할 수 있습니다.
Modifier(수정자) 노드 및 이벤트 기반 중단 아키텍처
Unity Behavior는 고전적인 트리 구조의 "Decorator(데코레이터)" 노드 개념을 "Modifier(수정자)" 노드 카테고리로 통합하여 훨씬 더 기능적인 프레임워크로 정립했습니다. 수정자 노드는 단 하나의 자식 노드만 가질 수 있으며, 연결된 자식 분기의 작동 방식, 실행 횟수(Repeat), 반환 상태(Inverter, Succeeder) 또는 활성화 조건(Cooldown)을 직접 관리하는 제어 구조입니다. Unity 생태계에서 이러한 노드 중 게임 흐름을 관리하는 가장 핵심적인 하위 유형은 "Abort(중단)" 및 "Restart(재시작)" 수정자입니다. Abort 노드는 Node Inspector를 통해 설정된 조건(예: 체력 < 20)이 충족될 때(Any Are True / All Are True), 하위 분기의 실행을 즉시 중단하고 부모에게 Failure를 전달합니다. 반면 Restart는 정반대의 논리로, 조건이 충족되면 현재 실행 중인 분기를 초기화하여 처음부터 다시 시작합니다.
Unity의 현대적인 시스템에서 진정한 혁신은 Unreal Engine의 전설적인 "Observer Aborts" 메커니즘을 직접 반영한 "Observer-based priority interruption(관찰자 기반 우선순위 중단)" 시스템입니다. 공식 가이드에 따르면 이 구조는 고우선순위 작업(그래프의 왼쪽 분기)이 조건 충족 시 저우선순위 작업(오른쪽 분기)을 자동으로 중단할 수 있게 합니다. 개발자는 에이전트가 순찰 중에 적을 발견했을 때 "Patrol(순찰)" 임무를 중단하고 "Attack(공격)" 분기로 전환하기 위해 순찰 분기에 복잡한 가드 절(guard clauses)을 작성할 필요가 없습니다. 고우선순위 왼쪽 분기(Attack)는 자신의 조건을 "Observer Abort" 모드로 정의합니다. 이를 통해 시스템은 백그라운드에서 자동으로 오른쪽의 순찰 작업을 관찰하며, 조건이 발생하면 저우선순위 작업을 취소하고 흐름을 왼쪽으로 전환합니다. 마찬가지로 "Self" 관찰자도 Unity에서 활성화되어 있습니다. 활성 분기가 실행되는 동안 자신의 전제 조건이 무효화되면 해당 작업은 즉시 취소됩니다. 이를 통해 유지보수 비용(maintenance complexity)은 낮고 계층 구조는 매우 읽기 쉬운(왼쪽에서 오른쪽으로 우선순위) 행동 그래프를 생성할 수 있습니다.
또한, Unity Behavior는 하위 그래프(Subgraphs)를 직접 지원합니다. 복잡한 행동(예: 순찰 경로 그리기)을 작은 그래프로 저장하고 "Run Subgraph" 노드를 통해 동적 또는 정적으로 메인 트리에 삽입함으로써 거대한 AI 시스템의 모듈식 설계를 보장합니다. 개발자는 전통적인 C# MonoBehaviour 구조와 유사한 OnStart, OnUpdate 및 OnEnd 메서드를 포함하는 스크립트를 통해 자신만의 커스텀 액션 노드(Custom Action Nodes)를 Behavior 시스템에 즉시 통합할 수 있습니다.
아키텍처 합성: Unreal Engine 5와 Unity Behavior 프레임워크의 비교 분석
업계를 지배하는 두 게임 엔진인 Unreal Engine 5와 Unity는 AI 결정을 위해 기본적으로 동일한 수학적 이론과 FSM의 복잡성을 해결하는 계층적 구조를 기반으로 하지만, 사용자 인터페이스, 용어 및 특정 문제 해결 방법론에서는 뚜렷한 차이를 보입니다.
개념 / 기능적 메커니즘 | Unreal Engine 5 (Behavior Tree) | Unity Behavior (v1.0+) (Behavior Graph) |
|---|---|---|
논리 OR 노드 | Selector Node(선택자). 성공적인 자식을 찾을 때까지 오른쪽으로 이동. | Try In Order Node. 명칭 외 기능은 완전히 동일. |
논리 AND 노드 | Sequence Node(순차). 고전적인 계층적 트리 배열. | Sequence Node / Implicit Stacking. 수직 배열은 자동으로 숨겨진 순차 노드를 생성. |
노드 조건 / 가드 필터 | Decorator Node(수식어). 분기 진입을 제어. | Modifier Node / Conditional Branch. 흐름 방향, 반복 횟수 및 논리를 수정. |
동적 중단 및 반응성 시스템 | Observer Aborts (None, Self, Lower Priority, Both). 블랙보드 변수를 수동으로 감시. | Observer-Based Priority Interruption (Self, Priority). 높은 우선순위가 항상 낮은 우선순위를 중단. |
백그라운드 데이터 업데이트 | Service Node. 복합 노드에 추가되어 분기 실행 시 특정 빈도로 틱 발생. | Run In Parallel 노드, C# 스크립트 또는 그래프 내 Action 노드로 병렬 처리. |
하위 트리 구성 및 모듈성 | Run Behavior Tree (트리 내에서 다른 트리를 Task로 실행). | Run Subgraph (정적 또는 동적 변수로 하위 그래프 삽입). |
상태 및 데이터 전달 메커니즘 | Blackboard Data Asset (독립적인 데이터 에셋 및 Keys). | Blackboard Variables (시각적 Blackboard 인터페이스 및 C# 참조 연결). |
표 3: AI 행동 트리 개념의 Unreal Engine 5와 Unity Behavior (버전 1.0.15+) 플랫폼 간 용어 및 운영 대응 관계. 두 엔진 모두 모듈성을 지향하지만, Unity는 명명 규칙에서 "인간 가독성(human-readable)"을 우선시했습니다.
분석 및 운영 통계에 따르면, 고전적인 FSM 설계에서 상태 수의 제곱에 비례하여 지수적으로 증가하는 () 전이(transition) 수와 비교했을 때, Behavior Tree 아키텍처에서 새로운 행동을 설계하는 것은 단순히 트리에 새로운 액션 또는 데코레이터 노드()를 추가하는 것만으로 충분합니다. 이러한 선형적인 구조적 성장은 Unity와 Unreal 플랫폼 모두에서 업계 표준이 된 거대하고 반응적이며 오류 없는 AI 설계를 가능하게 했습니다. 그럼에도 불구하고, 긴 작업이 트리 전체를 멈추게 하는 것을 방지하기 위해 "Running(실행 중)" 상태를 조작하는 것은 매우 중요합니다. AI 에이전트에게 A 지점에서 B 지점으로 이동하라는 명령이 내려지면, 이 작업이 완료될 때까지 매 루프마다 "Running"을 반환합니다. 프로세스가 오류 없이 종료되면 UE5 측에서는 Blueprint 내의 "Finish Execute" 노드로, Unity 측에서는 C# 스크립트의 OnEnd 메서드를 통해 성공 상태가 확정됩니다.
고급 개념 및 하이브리드 시스템: 상태 트리(State Trees)
행동 트리의 "기억 없는 반응성" 모델은 전술적 전투나 즉각적인 결정(마이크로 관리)에는 타의 추종을 불허하는 우위를 제공하지만, AI의 매우 장기적인 기분, 과거 맥락 또는 매크로 모드를 제어하는 데는 어려움이 있습니다. 개발자들이 가장 많이 제기하는 비판 중 하나는 과거 결정에 대한 데이터가 트리 설계 자체가 아닌, 어쩔 수 없이 Blackboard나 전역 변수에 저장되어야 한다는 점입니다.
UE5와 Unity 엔진이 제공하는 유연성 덕분에 개발자들은 행동 트리를 FSM과 합성하여 이러한 구조적 한계를 극복하는 방법을 찾았습니다. 특히 Unreal Engine 5.1부터는 엔진의 AI 생태계에 "State Trees(상태 트리)"라는 새롭고 혁신적인 개념이 도입되었습니다. 상태 트리는 FSM과 행동 트리의 아키텍처를 결합한 하이브리드 시스템입니다. 상태 트리는 일반적이고 광범위한 상태 관리(예: 전투, 도주, 순찰, 수면)를 위해 상태 머신 구조를 사용합니다. 그러나 머신이 "전투" 상태로 전환되면, 해당 상태 내부의 초 단위 반응과 작업 전체는 트리 논리를 사용하여 특정 전이 및 작업 기반 평가에 연결됩니다.
현대 게임 디자인 철학에서 전문가들이 적용하는 가장 유능한 방법론은 이 두 시스템을 병렬로 실행하는 것입니다. 개발자들은 "차분함", "의심", "공격적"과 같은 에이전트의 기분과 매크로 상태를 상태 트리(State Tree) 또는 매크로 관리자 클래스를 통해 관리합니다. 5 시스템이 "공격적" 상태로 전환되면, FSM이 액션으로 트리거하는 것은 사실 복잡한 "공격 행동 트리(Behavior Tree)"를 실행하는 것입니다. 에이전트가 그 순간 적에게 달려들지, 엄폐하고 탄창을 교체할지, 혹은 수류탄을 던지기에 적절한 거리인지에 대한 결정은 BT 내부의 선택자(Selector) 및 순차(Sequence) 노드에 의해 이루어집니다. 46 이 매크로-FSM과 마이크로-BT의 합성은 상태 머신의 높은 표현력과 행동 트리의 높은 반응성을 완벽하게 조화시킵니다.
결론
비디오 게임에서 AI의 계획 실행과 알고리즘 논리 체계는 수년간 거대한 산업 표준으로 자리 잡은 행동 트리(Behavior Trees) 덕분에 독보적인 유연성, 모듈성 및 설계 계층 구조를 갖추게 되었습니다. 순차 노드는 작업의 확실한 연쇄를 보장하고 실패를 즉시 필터링하는 반면, 선택자 노드는 전술적 우선순위 지정, 반응적 의사 결정 및 대안의 오류 없는 시도를 가능하게 합니다. 이 모든 복합적인 본체를 외부 껍질처럼 감싸는 데코레이터(수정자) 노드는 동적인 외부 자극에 즉각 반응하고 흐름을 조작할 수 있게 합니다. Unreal Engine 5는 이벤트 기반의 독보적인 인프라, Blackboard 최적화, 미세 조정을 제공하는 서비스(Service) 노드 및 고유한 Observer Abort 메커니즘을 통해 AI 프로그래밍에서 매우 성숙하고 성능 비용이 낮은 생태계를 제공합니다. 반면 Unity는 6세대 엔진의 핵심에 통합된 공식 Unity Behavior(행동 그래프) 패키지를 통해 이 표준을 시각화하고, "Try In Order"와 같은 직관적인 명칭으로 가독성을 높였으며, 현대적인 C# 통합을 통해 비선형적인 거대 그래프를 구성하는 데 있어 매우 접근하기 쉬운 차원으로 발전시켰습니다. 고전적인 상태 머신(FSM)에 비해 구축된 이 계층적 구조는 단순히 에이전트의 다음 행동을 선택하는 데 그치지 않습니다. 대규모 AI 시스템의 가독성, 디버깅 과정, 그리고 재사용 가능한 하위 분기(subgraphs)를 통한 프로젝트 기반 모듈성을 보장함으로써 게임 엔진 생태계에서의 독보적인 권위를 공고히 하고 있습니다. 체계적인 분석에 따르면, 현대 프로젝트에서 올바른 구성, 데코레이션 및 이벤트 기반 중단(Abort) 전략을 적절히 사용하는 것은 정적인 코드만으로는 만들 수 없는 유기적이고 지능적이며 살아있는 에이전트를 생성하는 가장 기본적이고 결정적인 조건입니다.
*정보 : 이미지는 Google Gemini에 의해 생성되었습니다.
