[알고리즘] 행동트리(Behaviour Tree) 정리

Lumos Velog·2025년 8월 5일

개요

행동 트리(Behavior Tree)는 계층적 구조를 갖는 트리 형태의 자료구조이다. 이 자료구조는 주로 게임 내 인공지능 캐릭터의 의사결정을 정의하기 위해 사용된다. 행동 트리는 상태 기계(Finite State Machine, FSM)에 비해 모듈화와 확장성이 우수한 자료구조이다. 각 행동 단위는 노드(Node)로 표현되며, 이들은 부모-자식 관계를 통해 트리 형태로 구성된다.





구성 요소

행동 트리는 다음과 같은 구성 요소로 이루어진 자료구조이다:

  • 루트 노드(Root Node): 트리 구조의 시작점이며, 전체 행동의 평가가 이 지점부터 시작된다.

  • 컴포지트 노드(Composite Node): 두 개 이상의 자식 노드를 포함하며, 자식 노드들의 실행 순서와 결과를 제어하는 역할을 한다.

  • 데코레이터 노드(Decorator Node): 하나의 자식 노드를 포함하며, 해당 자식 노드의 실행 결과를 수정하거나 조건을 추가하는 역할을 한다.

  • 리프 노드(Leaf Node): 자식 노드가 없는 단말 노드이며, 실제 조건 판단 또는 행동 실행을 담당한다.

이와 같은 구조는 트리 자료구조의 일반적인 계층적 특징을 따른다.





노드의 실행 결과

행동 트리의 각 노드는 실행 결과를 반환하는 구조이다. 이는 상위 노드의 흐름 제어에 영향을 미친다. 반환값은 다음 세 가지 상태 중 하나이다:

  • Success: 노드의 작업이 정상적으로 완료된 상태이다.

  • Failure: 노드의 작업이 실패한 상태이다.

  • Running: 노드의 작업이 아직 완료되지 않았음을 나타내는 상태이다.

이러한 상태는 트리 내에서의 흐름 제어를 위한 핵심 제어 신호로 작용한다.





노드의 종류

컴포지트 노드

컴포지트 노드는 여러 자식 노드를 포함하는 노드이다.


  • Selector 노드
    자식 노드를 순서대로 실행하며, 하나의 자식 노드라도 Success를 반환하면 자신도 Success를 반환하는 구조이다. 모든 자식 노드가 Failure를 반환할 경우에만 Failure를 반환한다.
    논리 연산 OR의 역할을 하는 구조이다.

  • Sequence 노드
    자식 노드를 순서대로 실행하며, 하나의 자식 노드라도 Failure를 반환하면 자신도 Failure를 반환한다. 모든 자식 노드가 Success를 반환할 경우에만 Success를 반환한다. 논리 연산 AND의 역할을 하는 구조이다.


데코레이터 노드

데코레이터 노드는 하나의 자식 노드를 감싸고, 해당 노드의 반환값이나 조건을 수정하는 구조이다.


  • Inverter 노드
    자식 노드의 결과를 반전시키는 역할을 하는 구조이다.
    (Success ↔ Failure, Running은 그대로 유지)

  • Repeater 노드
    자식 노드를 지정된 횟수 또는 조건이 만족될 때까지 반복 실행하는 구조이다.

  • 리프 노드
    리프 노드는 트리의 말단에 위치하며, 실제 게임 로직(조건 검사 또는 행동 수행)을 포함하는 구조이다.

  • Condition 노드
    특정 조건을 검사하여 Success 또는 Failure를 반환하는 구조이다.

  • Action 노드
    캐릭터가 실제로 수행하는 행동(예: 이동, 공격)을 실행하는 구조이다. 실행 중에는 Running 상태를 반환할 수 있으며, 완료 후 Success 또는 Failure를 반환한다.




실행 흐름 구조

행동 트리는 매 프레임 혹은 일정 주기마다 루트 노드로부터 하향식으로 평가되는 구조이다. 노드 평가 과정은 일반적으로 깊이 우선 탐색(DFS: Depth-First Search)을 따른다. 각 노드는 자식 노드의 실행 결과에 따라 자신의 상태를 결정하며, 이 상태는 상위 노드로 전파되는 방식이다.





장점

행동 트리는 다음과 같은 자료구조적 장점을 지닌다:

  • 모듈성(Modularity): 각 행동 단위가 독립적인 노드로 구성되므로 재사용과 테스트가 용이하다.

  • 유지보수성(Maintainability): 트리 구조를 통해 전체 로직을 시각화할 수 있으므로 디버깅 및 변경이 수월하다.

  • 확장성(Extensibility): 새로운 조건 또는 행동 노드를 추가하는 것이 구조적으로 간단하다.





예제

abstract class Node {
    public enum Status { Success, Failure, Running }
    public abstract Status Evaluate();
}

class Sequence : Node {
    private List<Node> children;

    public override Status Evaluate() {
        foreach (var child in children) {
            var result = child.Evaluate();
            if (result != Status.Success)
                return result;
        }
        return Status.Success;
    }
}

class IsEnemyInSight : Node {
    public override Status Evaluate() {
        return (EnemyDetected()) ? Status.Success : Status.Failure;
    }
}

class AttackEnemy : Node {
    public override Status Evaluate() {
        PerformAttack();
        return Status.Success;
    }
}

이 예제는 행동 트리의 Sequence 구조를 C#으로 표현한 것이다.





결론

행동 트리는 인공지능의 판단 구조를 정의하기 위한 트리 기반 자료구조이다. 각 노드는 독립적인 판단 및 행동 단위를 의미하며, 트리 전체는 복잡한 논리를 모듈화하여 구성할 수 있도록 돕는다. 유니티에서는 직접 구현 또는 시각적 툴을 통해 이 구조를 손쉽게 적용할 수 있으며, 특히 게임 캐릭터의 행동 로직 구현에 매우 적합한 자료구조이다.





0개의 댓글