본문 바로가기

유니티

[Behavior Designer] 01 . Behavior Tree

[Behavior Tree]

[FSM (유한 상태 기계) ]

=>상태와 전이로 구성되는 특정 유형의 로직을 제공한다 .

상태는 동시에 실행되는 행동 (애니메이션,사운드,대기)의 집합이다. 

전이는  조건을 포함한다. 전이의 조건이 충족된다면 , 상태는 다른 상태로 이동한다 .

유니티의 Mecanim (애니메이션 상태 머신 시스템)을 예로 들 수 있다.

 

=> 상태가 많아진다면 노드가 복잡해지며 서로 다른 문맥을 가진 로직을 재사용 할 수 없다.

이를 보완한것이 HFSM 이다.

 

[HFSM (계층적 유한 상태 기계) ]

=>HFSM은 FSM들을 그룹화 , 계층화 함으로 특정 문맥의 상태를 재사용 할 수 있다.

또한 FSM과 같이 현재의 문맥 / 상위 상태를 파악하기 쉽다. 최근까지 게임 AI에서 자주 사용되었다.

=>어느 정도의 확장성을 가지지만 , (하위) 상태를 모듈화 하는 기능을 제공하지 않는다.

특정 상태에서 전이되어야 하기에 같은 상태를 다른 문맥에서 사용이 불가하다.

ex)"걷기"상태는 "전투","추적"의 하위 상태가 되려면 해당 모듈에 "걷기"가 모두 추가 되어야 한다.

이때 , 같은 "겉기" 상태를 다른 목적 / 상황에 맞게 재활용하기 위해  Behavior Tree (행동 트리)가 생겨났다.

 

[Behaviour Tree (행동 트리) ]

=>Behavior Tree(이하 BT)는 많은 게임에서 사용하는 AI 테크닉이다.

=>BT의 주요 이점은 이해하기 쉽고 시각적인 Editor를 사용한다는 점이다.

=>BT는 Stack(스택)을 사용한다 . 스택은 후입 선출 구조를 사용하며 다음과 같다 . 

=>BT는 태스크(Task)집합으로 구성된다. BT에서는 모든것을 노드로 표현한다 .

태스트는 보통 Composite / Decorator / Conditional / Action으로 나뉜다 .

Action은 단말 태스크로 FSM의 행동 집합으로써의 상태에 가깝다.

 

Action task

=>실제 행동을 표현하는 단말 노드이다.일반적으로  Action.OnStart(), Action.OnUpdate(), Action.OnEnd()

등의 메서드를 가지고 있다. Action.OnUpdate()에서 true / false를 반환하면 그 Action의 작업이 끝난다.

 

=>스택에 처음 올라가면 OnStart가 , true나 false를 반환하지 않으면 계속해서 OnUpdate가 불린다.

true / false가 반환된다면 스택에서빠지며 OnEnd () 가 불린다

Composite task

=>복합 테스트 . 여러 개의 자식으로 구성된 테스크이다 . Select /Sequence/Parallel 등이 자주 사용되는 Composite이다.

이러한 Composite 의 핵심 용도는 node 의 flow 를 제어하는 것이다.

실행 순서는 위에서 아래 / 왼쪽에서 오른쪽이다.

 

=> Select composite  자식 노드가 true 를 반환할 때까지 자식 노드들을 실행한다(하나를 선택하는 것)

스택 구조로 도식화 하자면 다음과 같다 .

 

=>Sequence composite   자식 노드가 false 를 반환할 때까지 자식 노드들을 실행한다(순차적 실행)

 

=>Parallel 은 하위 task를 동시에 실행한다 .

 

 

Conditional Aborts

=>BT의 단말 노드에 존재하는 Action이 true/false를 반환하지 않는다면 그 작업에 머물러 있는다.

외부에서 강제적으로 Action의 실행을 중단시키고자 할 수 도 있을 것이다.

ex)"추적" Action은 일반적으로 내부에서 추적 완료 여부를 판단 할 것이다.만약 예외적인 조건 판단을 해당 Action에 

넣는다면 복잡해지며,다른 Action에 대한 종속성을 가지게 된다 . 

이럴 경우 "추적" Action을 취소시킬 방법인 조건부 취소(Conditional Aborts ) 혹은 평가를 재활성화 한다(Reactive Evaluation)이 필요하다.

 

=>조건부 취소는 실행 흐름에 영향을 주게 되므로 Composite 에 기능이 내장되어 있다. 어떤 변수를 계속 감시하고 있다가 변수의 값이 바뀌게 되면 지금의 실행 흐름을 취소시키고 자신의 노드로부터 재평가를 하는 것이다.

 

=>Conditional Aborts 는 보통 Self, Lower Priority, Both 로 이루어진다. Self 는 자신의 하위에 있는 태스크를 취소시키는 것이고, Lower Priority 는 자신의 오른쪽에 있는 이웃 노드의 흐름을 취소시키는 것이다. 그리고 Both 는 Self + Lower Priority 를 말한다.

 

Decoration task

=>Decoration task 는 조건을 의미한다. Decoration 은 하나의 자식만을 가질 수 있는데, 조건을 만족하면 자식을 실행하고, 조건을 만족하지 못하면 false 를 반환한다.

Decoration 이 지정하는 조건을 만족했을 경우의 반환 결과는 자식의 반환 결과에 의존한다.

Probability, TimeOut, CheckEvent 등이 있다.

=> "B" Action 과 "C" Action 의 실행 확률을 결정하고 싶다면, Probability task 를 사용한다.

 

[Behaviour Tree (행동 트리) vs FSM ]

=>BT는 AI에 주로 사용하고 , FSM은 일반적인 시각적 프로그래밍에 사용된다. 두 역할이 바뀔수는 있지만

설계의 목적과 어긋난다.

 

=>BT가 FSM에 비해 가져가는 장점은 다음과 같다.

  • 유연성 : FSM을 사용하여 한번에 두가지 상태를 실행하려면 두개의 개별 FSM을 만들어야 하지만 , BT는 Parallel Task에 추가하면 끝이다 . 모든 하위 작업이 병렬로 실행될것이다.
  • task Guard task : 두가지 사운드를 실행하는 예에서 , 동시에 실행되어 사운드가 겹칠수도 있다.이 상황에서 Semapre Task를 더함으로써(Task Guard라 칭함) 한번에 하나의 소리만 나게 한다.
  • 강력함 : FSM은 AI 생성에 많은 상태와 전환이 필요하며 이로 인해 스파게티 상태의 FSM을 만날수도 있다. BT는 더 쉽게 AI 생성이 가능하다.
  • 변경 : BT는 시각적인 Editor로 쉽게 만들 수 있으며 , FSM 에서 상태 실행 순서를 뱐걍히랴 상태간 전환을 변경해야 했다면 , BT는 드레그를 통한 순서변경이면 된다 . 

=>BT는 AI의 흐름을 설명할수 있고 FSM은 기능을 설명 할 수 있다.

 

 

 

출처