FSM, Behavior Tree - Unity
개요
Unity를 기반으로 AI를 만들기 위해서는 현재 상태를 저장하고 현재 상태의 행동을 실행하면 된다.
그러면 유니티에서는 어떠한 방법으로 AI를 만들까? 대표적으로는 FSM이 있다.
Finite State Machine (유한 상태 머신) 이란 상태를 기반으로 동작을 제어하는 방식을 구현하기 위한 디자인 패턴이다.
객체는 단 한 개의 State를 가질 수 있고, 각 State는 다른 State로 갈 수 있는 (Transition) 전이를 가지고 있다.
그렇다면 예를 들어 해당 객체는 Idle, Attack, Move라는 3가지의 상태를 가졌다고 가정해보자
위 사진 처럼 Idle 상태에서 Move와 Attack으로 갈 수 있는 형태가 있을 것이다. 그렇다면 이 3가지의 상태가 이렇게만 단순하게만 연결되어 있나? 아닐것이다.
위 사진 처럼
1. Idle -> Move
2. Move -> Idle
3. Move -> Attack
4. Attack -> Move
5. Idle -> Attack
6. Attack -> Idle
이렇게 6가지의 전이 형태를 만들어줘야한다.
그러면 상태가 이 3가지 말고 더 추가 된다면 결국 복잡하게 연결되어 있는 이러한 상태들로 AI를 만들어야 할 것이다.
"간단하게 몇가지 상태가 없는 객체에 사용하기에는 적합하지만 많은 상태가 필요하고 복잡한 경우에는 적합하지 않다."
그래서 이걸 보완하기 위해 나온 Behavior Tree가 있다.
*글쓴이는 Unity Asset Store에 있는 Behaviour Tree을 사용 하였다.
Behavior Tree는 무엇인가?
일련의 작업들을 순차적으로 실행하여 해당 작업의 동작을 수행하는 것이다.
그러면 왜 Behavior Tree를 사용하는 것인가?
Behaviour Tree는 FSM을 보완하여 몇가지 장점을 가지고 있다.
1. 유연성이 뛰어나다.
2. 서로의 상태를 모르기 때문에 유지보수가 쉽다.
3. 시각적으로 편집기를 통해서 만들기 때문에 변경하기가 매우쉽다 .
FSM으로 상태 실행 순서를 변경하려면 상태 간의 전환을 변경해야 한다. 하지만 행동 트리를 사용하면 작업을 드래그하기만 하면 된다. 그래서 전환에 대해 걱정할 필요가 없다.
위 사진은 현재 글쓴이가 Monster AI를 만들기 위해 작업해 놓은 것이다.
Behaviour Tree는 이러한 형태로 흐름이 이어진다. (위 부터 아래로, 왼쪽부터 오른쪽으로)
1. Entry 작업으로 인해 진입한다.
2. Repeater 작업으로 주기적으로 반복하여 실행한다. (실행 주기는 조정할 수 있다.)
3. Selector 작업으로 Sequence가 연결 되어있는 것을 선택한다.
4. 정상적으로 실행된다면 FindTargetSequence가 실행된다.
5. FindTargetSequence가 실행되면 FindTargetSequence가 연결되어있는 Action들을 검사하여 FindTargetSequence가 성공했는지 실패했는지 알 수 있다.
6. Has Target를 통해 타겟이 있는지를 찾는다.
7. Close Enough를 통해 타겟들 중 가장 가까이 있는 타겟을 설정한다.
8. Rotate Target 까지 왔다면 타겟이 설정이 되어있고, 해당 몬스터를 Rotate를 하고 다음으로 넘긴다.
9. Chase Target을 통해 해당 타겟에게 이동한다.
*만약 FindTargetSequence가 성공했다면 Patrol은 실행되지 않는다.
FindTargetSequence에 연결되어있는 작업들에서 Failed가 나왔을 때 다음 Sequence인 PatrolSequence로 이동하여 작업들을 수행한다.
이처럼 서로의 작업들을 모르고, 시각적인 편집기를 통해 AI를 만들기 때문에 변경하기가 쉽고 간단하다.