비헤이비어 트리 모델
비헤이비어 트리(행동 트리)는 그 이름 그대로 계층 구조를 가진 트리 구조에서 지정한 우선순위를 바탕으로 인공지능을 설계하는 방법이다.
비헤이비어 트리의 구조
행동 트리는 항상 Root라고 하는 최상위 노드가 존재한다.
일정 간격마다 루트로부터의 의사결정이 일어나서, 왼쪽에서부터 깊이 우선 탐색(DFS)을 하며 노드를 처리한다.

컴포짓(Composite)
행동 트리는 말 그대로, 행동을 중심으로 인공지능을 설계한다.
이 행동은 컴포짓(Composite)이라는 상위 노드를 통해 실행되는데, 컴포짓은 어떻게 수행하느냐에 따라서 나뉜다.
- 셀렉터(Selector) : 여러 행동 중 하나의 행동을 지정
- 시퀀스(Sequence) : 여러 행동을 모두 수행
- 패러렐(Parallel) : 여러 행동을 함께 수행

비헤이비어 트리에서는 우클릭을 통해 생성할 수 있다.
루트 노드는 하나의 컴포짓 노드밖에 연결할 수 없기 때문에 여러 컴포짓 노드를 연결하여 구조를 설계해야 한다.


행동 액션(Action)
컴포짓 노드의 동작은 컴포짓 노드가 관리하는 행동 노드의 결과에 따라서 다양하게 변환된다.
행동 노드는 수행한 결과에 따라서 4가지 정보로 구분해서 컴포짓 노드에 반환한다.
- 성공(Succeeded) : 행동이 완료되었고, 성공함
- 실패(Failed) : 행동이 완료되었지만, 실패함
- 중지(Aborted) : 행동이 진행되다가, 외부 요인으로 인해 행동이 중지함
- 진행 중(InProgress) : 아직 행동이 끝나지 않음 / 행동 결과를 홀딩함
셀렉터로 예를 들면, 셀렉터의 행동 노드를 왼쪽부터 순회하며 실행한다.
성공 액션이 나오면 바로 종료를 하고, 컴포짓 노드도 성공으로 종료한다.
시퀀스로 예를 들면, 시퀀스의 행동 노드를 왼쪽부터 순회하며 실행한다.
실패한 노드가 나오면 바로 전체 행동을 멈추고, 실패로 종료한다.
비헤이비어 트리에서는 행동 액션을 태스크(Task)라 칭한다.
기본적으로 여러 태스크들을 제공하고 있다.

컴포짓 부가 기능
행동 트리의 컴포짓 노드에는 다양한 부가 기능을 부착할 수 있다.
- 데코레이터(Decorator) : 컴포짓 노드가 실행되는 조건을 지정 (ex. if문)
- 서비스(Service) : 컴포짓 노드가 활성화중일 때 일정 주기 간격으로 실행하는 부가 명령 (ex. Tick)
- 관찰자 중단(Abort) : (데코레이터에 부착) 조건에 부합되면 해당 컴포짓 내 모든 활동을 중단
"학교에 간다"라는 컴포짓 노드가 있다고 하자.
여기서 "공휴일이 아닐 때"의 조건을 가진 데코레이터를 부착하면, 컴포짓 노드는 공휴일이 아닐 때만 실행이 된다.
여기서 "30분마다 현재 시간 알림"의 기능을 가진 서비스를 부착하면, 컴포짓 노드 실행 중에 30분마다 현재 시간을 알리게 된다.
여기서 "공격을 받으면 중지"의 조건을 가진 관찰자 중단을 부착하면, 공격을 받으면 컴포짓 노드에서 실행되는 모든 행동을 멈추고 행동 트리를 처음 루트부터 재시작한다.
공격을 받을 때까지 학교에 간다라는 설정이 있다고 하면, 관찰자 중단 기능을 설정하지 않으면 중간에 공격을 받더라도 학교에 간 후 멈추게 된다.
비헤이비어 트리에서는 컴포짓과 태스크에서 데코레이터와 서비스를 추가할 수 있다.
기본적인 데코레이터 조건들을 제공하고 있다.

관찰자 중단은 데코레이터에서 추가로 설정할 수 있다.
관찰자 알림(Notify Observer)과 관찰자 중단(Observer aborts)을 통해 설정한다.

관찰자 알림(Notify Observer)
- On Value Change : 관찰하는 키 값이 변경될 때마다 알림을 보낸다. (ex. 100 -> 120)
- On Result Change : 관찰하는 키 조건이 변경되었을 때 알림을 보낸다. (ex. true -> false)
관찰자 중단(Observer aborts)
- None : 아무것도 중단하지 않는다.
- Self : 자신과 이 노드의 서브 노드들을 중단한다.
- Lower Priority : 이 노드보다 낮은 우선순위(오른쪽)의 모든 노드들을 중단한다.
- Both : Self + Lower Priority이다. 자신과 이 노드의 서브 노드들, 이 노드보다 낮은 우선순위(오른쪽)의 모든 노드들을 중단한다.

비헤이비어 트리 구조 예시
퇴근하고 집에 가는 행동에 대한 행동 트리 설정
- 지하철 역까지 이동한 후, 지하철을 타고, 버스로 환승한 후, 문 앞에 도착한다.
- 이 행동 액션이 모두 성공해야 하기 때문에, 시퀀스 컴포짓을 사용하여 이들을 묶는다.

트리가 가진 깊이 특성을 활용하여 상황별로 세부적인 행동을 설계할 수 있다.
지하철 역 이동하는 방법을 여러 방법으로 나누고, 셀렉션 컴포짓을 통해 묶어 선택할 수 있도록 한다.
- 역까지 걸어서 이동한다.
- 역까지 버스를 타고 이동한다.

데코레이터(Decorator) 활용
컴포짓에 데코레이터 조건을 걸어서 비헤이비어 트리를 확장해 보자.
데코레이터가 부착된 컴포짓이 더 높은 우선순위를 갖기 위해서 왼쪽에 배치한다.

관찰자 중단(Abort) 활용
"약속"이라는 데코레이터를 추가하고, 약속이 있는 컴포짓을 생성한다.
약속이 있는 상태라면 가장 우선순위가 높은 약속 장소에 가는 컴포짓 노드를 실행한다.
약속이 없어 약속이 없는 컴포짓 루트를 실행하다가 도중에 약속이 생겨서 관찰자 중단이 활성화되면, 즉시 현재 행동을 모두 중단하고, 처음 Root로 돌아간다.

블랙보드 (Black Board)
블랙보드는 비헤이비어 트리에서 의사결정을 하기 위한 기본 데이터를 제공해 주는 데이터 저장소를 의미한다.
다양한 데이터 변수 값을 추가/선언해서 이를 가지고 비헤이비어 트리를 설계한다.
비헤이비어 트리에서 연결된 블랙보드를 확인할 수 있다.

블랙보드에서는 NewKey를 통해 새 변수들을 추가할 수 있다.

'📘Unreal Engine > 📝Unreal Engine' 카테고리의 다른 글
| [Unreal Engine] 오브젝트의 위치를 기준으로 위젯 위치 구하기 (0) | 2024.11.11 |
|---|---|
| [Unreal Engine] 가장 근접한 대상 찾기 (0) | 2024.11.11 |
| [Unreal Engine] 충돌 판정 / 트레이싱 (Tracing) (0) | 2024.08.09 |
| [Unreal Engine] 강 참조와 약 참조 (Hard and Soft Reference) (0) | 2024.08.05 |
| [Unreal Engine] 캐릭터 컨트롤 옵션 (0) | 2024.07.25 |