카테고리 없음

내일배움캠프 87일차 TIL 최종 프로젝트 - BT (Behavior Tree)

joseph2518 2025. 1. 16. 23:38

20250116 / Unity_6차  19주차 목요일

 

 

오늘 최종 프로젝트 결과물 브로셔를 작성하며 기술스택을 적는 중에, AI 관련하여 FSM을 사용한

이유에 대해서 쓰면서 BT를 채택하지 않은 이유에 대해 한 번 정리해 봐야 겠다는 생각을 했다.

 

Archer NPC State Machine


BT (Behavior Tree)의 개념

BTAI의 행동을 계층적으로 관리하는 트리 구조로, 각 행동과 조건을 노드(Node)로 표현합니다.
BT는 동적인 의사결정을 가능하게 하고, 행동 우선순위를 조정하거나 조건 평가를 통해 적합한 행동을 선택하는 데 유용합니다.

BT의 주요 구성 요소

  1. 루트 노드: 트리의 최상위 노드로, 모든 행동의 시작점입니다.
  2. 컴포지트 노드(Composite): 여러 자식 노드를 포함하며, Selector(우선순위 기반) 또는 Sequence(순차 실행) 방식으로 자식을 실행합니다.
  3. 데코레이터 노드(Decorator): 특정 조건을 기반으로 자식 노드의 실행 여부를 결정합니다.
  4. 리프 노드(Leaf): 트리의 끝부분에 위치하며, 실제 행동(Action) 또는 조건(Condition)을 담당합니다.

BT의 동작 방식

  • 루트 노드에서 시작하여 트리를 순회하며, 각 노드의 조건을 평가하고 실행할 행동을 결정합니다.
  • 조건이 충족되지 않으면 다른 노드로 이동하여 적합한 행동을 찾습니다.
  • 매 틱마다 트리를 재평가하여 현재 상황에 가장 적합한 행동을 실행합니다.

 

 

일단 내가 구현한 AI는 기본적으로 FSM(Finite State Machine)의 State Machine을 가지고 있다.

 

그러나 각 State에서 배회, 목표물 공격 등 저수준 인공지능 행동을 수행하기 위해 배회에는 이동/정지,

목표물 공격에는 접근/선딜레이/공격모션/후딜레이 와 같은 Sequence가 내부적으로 존재한다.

 

이는 BTSequence 노드가 순차적으로 자식 행동을 실행하는 것과 유사하다고 볼 수 있다.

(물론 이 State를 또하나의 저수준 FSM이라 평가할 수도 있다)

 

또한 최상위 목표인 Command가 주어졌을 때 명령 수행 위치와 떨어져 있으면 먼저 목표로 이동하고

이후에 다시 현재 위치를 평가하여 다음 행동을 수행한다는 부분은 목표 중심의 실행 구조를 가진

BT의 사용 의도와 일치한다.

 

게다가 하나의 State 내에서도 어느 정도 행동이 가능하게끔 Sequence를 넣어버린 시점에

State 전환까지 수행하면 구조가 너무 복잡해지고 얘기치 못한 버그가 발생할까 봐

상위 AI에서만 State 전환이 가능하게 했다는 점에서 일반적인 FSM과는 또 다르다.

 

 

하지만 그렇다고 BT를 사용했다고 하기엔 결정적으로 트리 구조를 사용하지 않았다.

 

또한 목표 중심적 설계도 어디까지나 일부일 뿐, 기본적으로 State에서 다른 State로의 전환이

주요 로직으로 자리하고 있다.

 

마지막으로 State를 평가하여 우선순위를 정한다는 개념이 없다.

 

 

내가 NPC AI를 구현함에 있어 BT 채택하지 않은 이유는 그럴 필요가 없었기 때문이다.

 

하나의 State가 많은 일을 수행하게 된 후로 각 NPC의 State Machine이 가진 State 수도 4,5개 수준으로

줄어버렸고, 최상위 목표인 Command도 그렇게 자주 바뀌지 않는다.

 

지속적으로 행동의 우선순위를 평가할 필요가 없다는 뜻이다.

 

현재 Gizmo를 통해 AI State를 에디터에서 확인할 때도 매우 직관적으로 보인다는 것도 아주 마음에 든다.

 

 

 

막상 써 놓고 보니 어째 BT 보다는 HFSM과 굉장히 유사하다고 생각되는데,

( 상태 내에서 하위 FSM을 통한 단계적 행동 처리, State Lock을 이용한 상위 상태 보호 등 )

 

앞으로는 설명할 때 확장된 FSM으로 시작하여 HFSM의 계층적 특성을 일부 포함했다고 하면 될 것같다.