BTNode Editor

행동 트리 구조를 손쉽게 구성할 수 있는 Behaviour Tree 에디터의 사용 방법을 알아봅시다. 에디터를 활용하면 스크립트로 노드를 결합하지 않아도 노드를 배치하고 선으로 연결해 시각적으로 행동 트리를 제작할 수 있습니다.

##### 참고 가이드

  * [행동 트리를 활용한 AI 만들기](/docs?postId=562%7B%22target%22:%22_blank%22%7D)
  * [행동 트리 노드 만들기](/docs?postId=1155%7B%22target%22:%22_blank%22%7D)



##### 참고 API Reference

  * [AIComponent](/apiReference/Components/AIComponent%7B%22target%22:%22_blank%22%7D)
  * [ActionNode](/apiReference/Misc/ActionNode%7B%22target%22:%22_blank%22%7D)
  * [BTNode](/apiReference/Misc/BTNode%7B%22target%22:%22_blank%22%7D)
  * [BlackBoard](/apiReference/Misc/Blackboard%7B%22target%22:%22_blank%22%7D)
  * [CompositeNode](/apiReference/Misc/CompositeNode%7B%22target%22:%22_blank%22%7D)
  * [ParallelNode](/apiReference/Misc/ParallelNode%7B%22target%22:%22_blank%22%7D)
  * [ParallelNode](/apiReference/Misc/ParallelNode%7B%22target%22:%22_blank%22%7D)
  * [SequenceNode](/apiReference/Misc/SequenceNode%7B%22target%22:%22_blank%22%7D)



## BehaviourTree

BehaviourTree는 AI의 의사 결정과 행동을 표현하는 데이터로 노드의 정보와 노드들의 계층 구조 정보를 저장합니다. BehaviourTree는 BehaviourTree Editor에서 제작, 수정할 수 있습니다. 크리에이터가 정의한 BehaviourTree을 AIComponent의 BehaviourTreeId 프로퍼티 값으로 설정하면, 플레이 시점에 로드됩니다.

## Behaviour Tree Editor

Behaviour Tree 에디터는 두 가지 방법으로 열 수 있습니다. 이후 모든 편집은 이 에디터에서 수행하며, 편집할 행동 트리를 먼저 선택해야 합니다.

  * Workspace - MyDesk - Create BehaviourTree
  * Panels - Behaviour Tree Editor
  * Workspace - MyDesk - 생성한 BehaviourTree - Property 창 - Open BTNodeEditor 버튼 클릭



[png](178185079951188ee09550a7044458d10c16177d1e440)

[{"번호":"!","이름":"추가 버튼","설명":"새로운 Bebaviour Tree를 생성하거나, 기존 Behaviour Tree를 선택합니다."},{"번호":"!","이름":"Scale 슬라이더","설명":"캔버스 영역의 확대\/축소 배율을 조절합니다."},{"번호":"!","이름":"Blackboard","설명":"트리가 의사결정에 사용할 키와 값을 저장합니다. 행동 트리 엔트리와 1:1로 대응합니다."},{"번호":"!","이름":"Inspector","설명":"노드의 프로퍼티 값을 설정할 수 있는 창입니다."},{"번호":"!","이름":"캔버스","설명":"추가한 노드의 흐름을 확인하고 편집할 수 있는 창입니다."}]

### 노드 생성

노드 종류에 따라 노드를 생성하는 방식이 다릅니다.

#### Composite Node 생성

Composite Node인 SelectorNode, ParalledNode, SequenceNode를 바로 생성할 수 있습니다. [png](1781850815868dae912f9625c432da48bdce1e51eef7b)

#### ActionNode 생성

  1. Workspace - MyDesk - Create Scripts - Create BTNodeType - Create Action Node를 눌러 Action Node를 생성하고, 행동을 정의합니다. [행동 트리를 활용한 AI 만들기](/docs?postId=562%7B%22target%22:%22_blank%22%7D)를 참고하세요.
  2. BehaviourTree Editor - 컨텍스트 메뉴 - Action Nodes - 생성한 ActionNode를 선택해 추가할 수 있습니다. [png](17818550670146af1c0ed9b9f40da9390b91807e102e9)



#### Decorator Node 생성

  1. Workspace - MyDesk - Create Scripts - Create BTNodeType - Create Decorator Node를 눌러 Action Node를 생성하고, 행동을 정의합니다. [행동 트리를 활용한 AI 만들기](/docs?postId=562%7B%22target%22:%22_blank%22%7D)를 참고하세요.
  2. BehaviourTree Editor - 컨텍스트 메뉴 - Action Nodes - 생성한 Decorator Node를 선택해 추가할 수 있습니다. [png](178185505683655a00207e5484ecbbf45ba397c339ec0)



### 노드 정의

노드에 선언된 프로퍼티는 에디터에서 직접 편집할 수 있습니다. 편집할 노드를 선택하면 인스펙터 창에 해당 노드의 프로퍼티 목록이 표시됩니다. 프로퍼티 값에 블랙보드의 키 이름을 입력하면 런타임에 해당 키의 값을 참조합니다.

### 노드 삭제

삭제할 노드를 선택한 후 Delete 키를 누르거나, 컨텍스트 메뉴에서 삭제를 선택합니다.

### 노드 연결

노드 연결은 오직 출력에서 입력으로만 가능합니다. 노드의 출력 부분을 선택하고 드래그해 노드를 연결할 수 있습니다. 노드의 실행 순서는 왼쪽에서 오른쪽으로 진행됩니다. Composite Node 종류의 노드만 다른 노드로 노드를 연결할 수 있습니다. 루트 노드 하위에 연결된 노드들의 실행 순서는 노드의 오른쪽에 표시되므로 실행 순서에 맞게 정렬해야 합니다. [png](1781855177654dc7dfe8bf18f41e7a930f368677e92ab)

### 노드 연결 해제

연결을 해제할 노드 선택 - 컨텍스트 메뉴 - 노드 링크 끊기 - 전체 노드 끊기/ 부모 노드만 끊기를 선택해 연결을 해제할 수 있습니다.

  * 전체 노드 끊기: 노드에 연결된 모든 링크를 해제합니다.
  * 부모 노드만 끊기: 부모 노드와의 연결만 해제합니다.



## Blackboard

BlackBoard는 런타임에 사용할 값의 키를 미지 정의할 때 사용합니다. 행동 트리와 1:1로 대응합니다. BehaviourTree Editor에서 타입, 키, 값을 추가하거나 수정할 수 있습니다. 트리의 노드는 블랙보드 키로 값을 읽지만, 실제 동작은 BTNodeType을 생성해 정의해야 합니다. `BlackBoard`메소드로 접근해 값을 기록하면, 트리의 노드가 해당 키를 참조해 행동을 결정합니다. [png](1781851780376100410b85b7041139d87b3ed4d760649)

## AIComponent와의 관계

행동 트리는 AI의 행동을 정의한 데이터일 뿐이므로 단독으로 실행될 수 없습니다. 제작한 행동 트리는 AIComponent의 `BehaviourTreeId`로 지정해 사용해야 합니다. 하나의 행동 트리를 여러 엔티티가 공유해 사용할 수 있습니다. 이때 각 인스턴스는 독립적으로 동작하므로 서로 영향을 주지 않습니다.

> 주의 `BehaviourTreeId`는 플레이 시점에 수정할 수 없습니다.

[png](1781852862892519752cb11724d9699d4d192aed100c4)

## 활용 예제

맵에서 플레이어가 범위 내에서 감지되면 추적하는 몬스터 AI를 만들어봅시다.