
프로젝트 개요
- 개요 : Unity에서 사용 가능한 Behaivor Tree AI 패키지
- Owner & Maintainer : 홍기표(Postive)
- 도구 : Unity, C#
- Github : https://github.com/Postive-ToolKit/SimpleBehaviorTree
- 시연 영상
기능
- 핵심 기능:
- Tree 구조를 활용한 AI 행동 트리 구현
- 시작, 일시정지, 정지 기능 제공
- 노드 별 카테고리 분류 기능
- 추가 구현 내용:
- 블랙보드 시스템 추가
- BTRunnerComponent에 Tree 컨트롤러 제공
- Tree 기능 추가
- 정렬 기능 : 백트래킹 알고리즘
- 루트 노드 복귀 기능
- 트리 파일 탐색 기능
- 런타임 디버그 기능
- 행동 트리의 진행 상황 실시간 확인.
- 노드 추가 및 실행 가능
- 현재 행동 트리 진행 상황 표시
🆕효과
- 행동 트리 제작 및 유사 패턴 재사용 과정의 효율성 증가.
- 런타임 디버깅을 통해 문제를 신속히 발견 및 수정 가능.
- AI의 행동 로직 가독성과 관리 용이성 향상.
기능 상세
Node 카테고리 분류
⚠️ 문제 사항
- 행동 노드가 많아지며 원하는 노드들을 찾기 어려워 지는 문제를 해결해야 한다.
🆕 개선 방식
- 노드의 카테고리를 설정할 수 있도록 Overriding 가능한 NodeCategory 프로퍼티를 추가하여 코드 상에서 카테고리를 설정할 수 있도록 하였다
💫 개선 결과
- 노드를 찾을 때 카테고리로 분류되어 더욱 손쉽게 노드를 찾을 수 있게 되었다.

Conditional Abort
⚠️ 문제 사항
- CompositorNode가 실행되고 있을 때 조건이 바뀌는 경우 기본적인 행동 트리 기능 만을 활용하면 노드가 기민하게 바뀌지 않아 원하는 방식으로 AI가 작동하지 않는 문제가 있었다.
🆕 개선 방식
- None, Self, Lower Priority 세가지의 Conditional Abort 기능을 Compositor Node에 추가하여 자식 노드의 실행 조건에 기민하게 반응하고 다른 노드로의 전환이 이루어지도록 하였다.
💫 개선 결과
- 필요한 Compositor Node에 Conditional Abort를 적용하는 것이 가능하기에 기존 방식을 유지하면서 큰 수정 없이 유기적인 노드 전환 기능 추가 및 작동이 가능했다.

Behavior Tree Editor(행동 트리 에디터)
⚠️문제 사항
- 행동 트리를 수정하고 생성하는데 있어 재사용성을 높이고 AI의 가독성을 높이기 위해 에디터가 필요하다.
- 런타임 상황에서 현재 AI의 진행 상황을 명확히 확인할 수 있어야 유지 관리가 편하다.
🆕 개선 방식
- 행동 트리 에디터를 제작
- 에셋이나 행동 트리를 가진 오브젝트를 클릭하면 자동으로 에디터가 열리도록 하였다.

- 트리 자동 정렬 및 시작 노드로 복귀 기능
- 트리 제작 시 관리를 쉽게 하였다.

- 선택한 모든 노드 Copy/Paste 기능
- 같은 행동 패턴의 복제 및 재사용을 쉽게 하였다.

- 현재 AI 진행 상황 확인 기능
- 런타임에서 AI 진행을 가시적으로 확인하는 것으로 디버깅을 쉽게 만들었다.

💫 개선 결과
- 행동 노드 및 트리의 재사용성 증가
- AI 디버깅 프로세스의 효율 향상
구조

코드 및 사용 방법
코드 상세
BTRunnerComponent
- Unity의
MonoBehaviour를 상속받아 동작 트리를 실행, 중지, 업데이트하는 컴포넌트이다. 블랙보드 데이터를 관리하고 트리의 상태를 제어한다.
| 함수 이름 | 기능 |
BTSendMessage | 블랙보드의 "Message" 키에 데이터를 설정 |
BTSetData | 블랙보드에 새로운 데이터를 설정 |
BTRemoveData | 블랙보드에서 특정 데이터를 제거 |
SetTree | 트리를 설정하고 실행 상태를 초기화 |
Stop | 현재 실행 중인 트리를 중지 |
Play | 트리를 실행 상태로 전환 |
Pause | 트리를 일시 중지 |
BehaviourTree
- 동작 트리(Behaviour Tree)를 정의하고 실행하는 클래스다. 루트 노드를 통해 트리의 상태를 관리하고, 클론 기능을 통해 복제된 트리를 생성할 수 있다.
| 함수 이름 | 기능 |
BTUpdate | 루트 노드를 통해 트리를 실행하고 현재 상태를 반환 |
Stop | 모든 노드의 상태를 초기화하고 실행을 중단 |
Clone | 현재 트리를 소유자와 함께 복제 |
BTNode
- 동작 트리의 기본 단위를 정의하는 추상 클래스다. 트리 내에서 실행, 중지, 상태 관리 등의 공통 로직을 포함하며, 자식 클래스에서 특정 동작을 구현하도록 설계되었다.
| 함수 이름 | 기능 |
Run | 노드를 실행하고 상태를 반환합니다. 실행 중 상태가 변경되면 중지 |
Evaluate | 현재 노드의 상태를 평가하여 성공 또는 실패를 반환 |
Clone | 노드를 복제 |
BTStart | 노드 실행 시작 시 초기화 작업을 수행 |
BTStop | 노드 실행 종료 시 정리 작업을 수행 |
OnInitialize | 노드가 처음 초기화될 때 실행 |
OnStart | 노드가 실행을 시작할 때 호출 |
OnRun | 노드 실행 중 매 프레임 호출되며, 상태를 반환 |
OnStop | 노드 실행이 멈출 때 호출 |
ActionNode
- 동작 트리에서 실제 동작을 수행하는 노드이다. 실행 시 특정 동작을 수행하고, 성공, 실패, 또는 진행 중 상태를 반환한다.
| 함수 이름 | 기능 |
Evaluate | 항상 성공 상태를 반환하며, 기본 동작 수행이 목적 |
DecoratorNode
- 단일 자식 노드를 감싸고, 자식 노드의 실행 조건이나 결과를 조작하는 노드이다. 실행 논리나 조건을 추가로 정의할 수 있다.
| 함수 이름 | 기능 |
Evaluate | 자식 노드의 상태를 평가하고 결과를 반환 |
OnEvaluate | 자식 노드의 실행 조건이나 결과를 변경할 수 있음 |
ConditionNode
- 특정 조건을 평가하는 노드로, 블랙보드 데이터를 기반으로 성공 또는 실패 상태를 반환한다.
| 함수 이름 | 기능 |
Evaluate | 블랙보드 데이터를 기반으로 조건을 평가하고 상태를 반환 |
GetConditionState | 실제 조건 판단 로직을 구현하는 추상 함수 |
CompositeNode
- 여러 자식 노드를 가질 수 있는 노드로, 자식 노드들의 실행 순서와 결과를 관리한다. 조건에 따라 특정 노드만 실행하거나 평가를 진행한다.
| 함수 이름 | 기능 |
RunChildren | 자식 노드들을 순차적으로 실행하거나 조건에 따라 결과를 반환 |
OnActiveEvaluate | 활성화된 상태에서 자식 노드를 평가 |
OnDeActiveEvaluate | 비활성화된 상태에서 자식 노드를 평가 |
OnLowerPriorityEvaluate | 낮은 우선순위 자식 노드의 상태를 평가 |
BlackBoard
- 동작 트리에서 데이터를 공유하기 위한 키-값 구조의 데이터 저장소이다. 부모-자식 블랙보드 계층을 통해 데이터를 상속하거나 덮어쓴다
| 함수 이름 | 기능 |
Get | 주어진 키에 해당하는 데이터를 반환 |
Get<T> | 특정 형식의 데이터를 반환. |
Contains | 특정 키의 존재 여부를 확인 |
Set | 키-값 쌍으로 데이터를 저장 |
Remove | 특정 키의 데이터를 제거 |
Clear | 모든 데이터를 삭제 |
