본문으로 건너뛰기

안동민 개발노트

본문 시작

비헤이비어 트리의 기본 이해

셀렉터·시퀀스·태스크·데코레이터·서비스와 블랙보드의 역할을 익혀 AI 행동 트리의 뼈대를 구성합니다.

지금까지는 플레이어 캐릭터 움직임, 상호작용, UI 개발을 다뤘습니다.

하지만 게임 세계를 완성하려면 플레이어와 상호작용하는 인공지능(AI) 캐릭터가 필요합니다.

언리얼 엔진은 복잡한 AI 동작을 설계/구현할 수 있도록 비헤이비어 트리(Behavior Tree)를 제공합니다.

이번 장에서는 AI 시스템 구축의 핵심 요소인 비헤이비어 트리를 중심으로 정리합니다.

비헤이비어 트리의 기본 이해

NPC의 판단을 계층 구조로 정리하고, 상황에 맞는 행동을 선택하게 만드는 AI 설계 도구입니다.

  1. 비헤이비어 트리의 기본 이해 흐름

    NPC가 감지, 판단, 이동, 공격 같은 행동을 수행하도록 만드는 전체 로직입니다. 2 조건과 행동을 트리로 배치해 우선순위와 실행 순서를 시각적으로 관리합니다. 3 TargetActor, CurrentHealth 같은 판단 데이터를 키-값 형태로 공유합니다. 4 Pawn을 제어하고 Behavior Tree를 실행해 실제 게임 캐릭터와 연결합니다.

  2. AI 시스템

    NPC가 감지, 판단, 이동, 공격 같은 행동을 수행하도록 만드는 전체 로직입니다.

  3. Behavior Tree

    조건과 행동을 트리로 배치해 우선순위와 실행 순서를 시각적으로 관리합니다.

  4. Blackboard

    TargetActor, CurrentHealth 같은 판단 데이터를 키-값 형태로 공유합니다.

  5. AI Controller

    Pawn을 제어하고 Behavior Tree를 실행해 실제 게임 캐릭터와 연결합니다.

  6. 읽는 기준

    복잡한 AI 로직을 작은 노드 단위로 나눕니다. 높은 가치의 행동을 먼저 판단하고 실패하면 다음 대안을 봅니다. 실행 중인 노드와 Blackboard 값을 함께 보며 원인을 추적합니다.

  7. 구조화

    복잡한 AI 로직을 작은 노드 단위로 나눕니다.

  8. 우선순위

    높은 가치의 행동을 먼저 판단하고 실패하면 다음 대안을 봅니다.

  9. 디버깅

    실행 중인 노드와 Blackboard 값을 함께 보며 원인을 추적합니다.

  10. Tree
    Tree 판단 구조
  11. 점검표
    점검표 상태 저장
  12. Task
    Task 행동 실행

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)를 반환하며, 이는 부모 컴포지트 노드의 흐름 제어에 영향을 미칩니다.
  • 활용: 목표 위치로 이동, 공격 애니메이션 재생, 잠시 대기 등입니다.

아래 다이어그램은 비헤이비어 트리가 한 번 판단할 때 어떤 순서로 조건을 보고 행동을 실행하는지 정리한 것입니다.

Composite가 고르고, 허용된 Task의 결과가 되돌아간다

한 틱은 단순한 위→아래 실행이 아니다. Composite가 자식을 순서대로 살피고, Decorator가 현재 Blackboard 값으로 가지를 거른 뒤 Task의 성공·실패가 다시 부모의 다음 선택을 결정한다.

  1. Root 진입

    AI Controller가 실행 중인 트리의 평가를 이어 간다.

  2. 우선순위 탐색

    Selector는 첫 성공을, Sequence는 첫 실패를 찾는다.

  3. Decorator 판정

    거리·시야 같은 조건이 거짓이면 그 가지를 건너뛴다.

  4. Task 실행

    Move To, Attack, Wait가 행동 후 결과를 반환한다.

  5. 결과 전파

    Success·Fail·Running이 부모로 올라가 다음 평가를 정한다.


비헤이비어 트리와 블랙보드(Blackboard)

Behavior Tree와 Blackboard 역할 분담

AI Controller, Blackboard Key, Behavior Tree의 Task, Decorator, Service가 어떤 책임으로 협력하는지 구조화한다.

  1. AI Controller 시작

    Pawn을 소유한 Controller가 Blackboard와 Behavior Tree를 초기화한다. possess

  2. 키 갱신

    Perception, 거리, 체력, 목표 위치 같은 값이 Blackboard Key에 저장된다. memory

  3. 조건 평가

    Decorator는 키 값을 보고 분기 실행 여부를 결정한다. decorator

  4. 행동 실행

    Task는 이동, 공격, 대기 같은 실제 행동을 수행하고 결과를 반환한다. task

  5. 키 이름

    블루프린트와 Blackboard의 Key 이름과 타입을 일치시킨다.

  6. Abort 설정

    상태 변화가 즉시 행동 전환을 일으켜야 하는지 정한다.

  7. 디버그

    Behavior Tree 디버거에서 현재 활성 노드와 키 값을 확인한다.

Behavior Tree는 판단 순서, Blackboard는 판단 값을 맡는다

AI가 이상하게 움직일 때는 Task보다 Blackboard 값과 Decorator 조건을 먼저 본다.

  1. Perception

    TargetActor, PatrolPoint 같은 관측 값을 만든다.

  2. Blackboard

    공유 상태를 Key-Value로 저장한다.

  3. Decorator

    지에 들어갈 조건을 검사한다.

  4. Composite

    Selector와 Sequence가 우선순위를 고른다.

  5. Task

    Move To, Attack, Wait 같은 행동을 실행한다.

기준판정
Blackboard가 틀림트리 구조가 맞아도 엉뚱한 행동을 고른다.
Decorator가 강함Task가 실행되기 전에 가지가 계속 막힌다.
Task가 실패함결과가 상위 Composite으로 되돌아간다.

비헤이비어 트리는 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 행동 구현 방법을 구체적인 예시와 함께 다루겠습니다.

처음 설정할 때는 트리 자체보다 컨트롤러, 블랙보드, NPC 폰 연결이 빠지기 쉽습니다.

아래 점검표로 실행 경로를 따라가면 AI가 멈춰 있는 원인을 더 빠르게 찾을 수 있습니다.

AI가 움직이지 않을 때 먼저 보는 연결 경로

비헤이비어 트리는 에셋을 만든 뒤 AI Controller가 실행하고, Blackboard 키가 채워져야 태스크까지 내려갑니다.

  1. NPC가 AI Controller를 사용해야 한다

    Pawn BP_EnemyCharacter의 AI Controller Class가 AIC_Enemy로 설정되어 있는지 확인합니다.

  2. BeginPlay에서 트리를 실행한다

    Controller AIC_Enemy의 Event BeginPlay 뒤에 Run Behavior Tree가 연결되어야 합니다.

  3. 키 이름과 타입을 맞춘다

    Blackboard TargetActor, TargetLocation 같은 키가 Decorator와 Task에서 같은 이름으로 쓰이는지 봅니다.

  4. 실제 행동 노드가 결과를 반환한다

    Task Move To, Wait, Attack 태스크가 성공 또는 실패를 돌려줘야 부모 노드가 다음 판단을 합니다.


AI가 움직이지 않을 때는 비헤이비어 트리 노드만 보지 말고, 컨트롤러가 트리를 실행했는지, 블랙보드 키가 갱신되는지, 폰에 컨트롤러가 붙었는지를 함께 추적해야 합니다.

Behavior Tree 실행 경로

트리 노드가 맞아도 AI Controller가 실행하지 않거나 Pawn에 컨트롤러가 붙지 않으면 아무 행동도 시작되지 않습니다.

  1. 컨트롤러 클래스 지정

    폰 NPC Pawn의 AI Controller Class가 실제 컨트롤러 블루프린트를 가리켜야 합니다.

  2. 시작
    BeginPlay에서 실행

    시작 컨트롤러가 Run Behavior Tree로 BT 에셋을 시작하는지 확인합니다.

  3. 상태
    블랙보드 값 갱신

    상태 TargetActor, PatrolLocation 같은 키가 비어 있으면 조건 노드가 계속 실패합니다.

  4. 선택
    Selector가 행동을 고른다

    선택 Decorator 조건을 통과한 가지에서 Move To·Attack·Wait Task를 실행합니다.


이번 절에서는 언리얼 엔진 AI 시스템의 핵심인 비헤이비어 트리의 기본 개념과 블랙보드와의 관계, 그리고 기본적인 설정 방법에 대해 알아보았습니다.

비헤이비어 트리는 복잡한 AI 로직을 시각적이고 체계적으로 관리하는 데 필수적인 도구입니다.

마지막으로 비헤이비어 트리를 읽을 때 Selector, Sequence, Blackboard Key의 판단 단위를 정리합니다.

Behavior Tree 판단 단위 읽기

Behavior Tree는 Selector와 Sequence가 우선순위를 만들고 Blackboard가 판단 값을 보관하는 구조입니다.

  1. AIController가 트리를 실행합니다

    AIC_Enemy가 Run Behavior Tree를 호출하고, Service와 Task는 Blackboard Key를 읽고 쓰며 행동을 선택합니다. 01 Selector는 왼쪽부터 성공 가능한 가지를 고르고, 공격, 추적, 순찰 순서처럼 중요한 행동을 앞에 둡니다. 02 Sequence는 조건 확인과 행동 실행이 모두 성공해야 하므로 Decorator와 Task의 실패 이유를 구분합니다. 03 TargetActor, TargetLocation, PatrolIndex 같은 Blackboard Key 타입을 정확히 맞춰 Task 간 데이터를 공유합니다.

  2. AIController가 트리를 실행합니다

    AIC_Enemy가 Run Behavior Tree를 호출하고, Service와 Task는 Blackboard Key를 읽고 쓰며 행동을 선택합니다.

  3. 우선순위

    Selector는 왼쪽부터 성공 가능한 가지를 고르고, 공격, 추적, 순찰 순서처럼 중요한 행동을 앞에 둡니다.

  4. 연속 조건

    Sequence는 조건 확인과 행동 실행이 모두 성공해야 하므로 Decorator와 Task의 실패 이유를 구분합니다.

  5. 공유 메모리

    TargetActor, TargetLocation, PatrolIndex 같은 Blackboard Key 타입을 정확히 맞춰 Task 간 데이터를 공유합니다.