유니티 Behaviour Designer란?

Behaviour Tree, 줄여서 BT라고 불리는 이 용어는 예전부터 들어왔었습니다.

하지만 BT의 실용성에 대해 그닥 느끼지 못했기에 지금까지 사용하지 않았지만 FSM Pattern을 직접 제작해보고 난 이후 BT의 실용성을 알게 되었습니다. 

 

 

FSM - HFSM - BT 구조

오늘 친구들과 이야기를 하면서 FSM과 BT(Behavior Tree)에 대해 이야기를 나누었습니다. 생각난 김에 해당 구조들에 대해 글을 작성해 보려고 합니다. 각 구조들은 AI 행동 패턴을 설계하는등 다양한

neulsang-day.tistory.com

 

위 사이트에 들어가시면 FSM, HFSM, BT에 대한 설명과 차이를 굉장히 잘해놓으셔서 쉽게 이해할 수 있습니다.


Behaviour Designer란?

많은 API들이 존재한다

 

Behaviour Designer에셋은 Behaviour Tree 설계 및 제작을 도와주는 도구라고 생각하시면 됩니다.

Behaviour Designer에는 많은 API들이 있어 새로운 작업을 제작하는데 도움이 되며, 코드 작성 없이 복잡한 AI를 생성할 수 있다고 나와있습니다. 

 


Behaviour Tree 이론

Root Task

 

Behaviour Tree에는 Tree의 Root역할을 하는 Task가 존재하며, 깊이 우선 순위로 작업을 실행합니다. 작업의 순서는 왼쪽에서 시작하여 -> 오른쪽 순서로 진행됩니다.

 

Behaviour Tree를 구성하는 4가지 요소는 굉장히 중요합니다.

Task Type Description  Sub-Types(하위 유형)
Action 특정 작업을 통해 게임 상태를 변경 N/A
Conditional 게임의 조건이나 상태를 확인 N/A
Composite 하위 작업이 실행되는 방법을 지정하는 상위 작업 Sequence Task, Parallel Task
Decorator 단일 하위 작업의 동작을 수정 N/A

 

Task Type Description 
Sequence Task 1. 위 작업들이 모두 성공해야 전체적으로 성공한 것으로 간주합니다.
2. 만약 하위 작업 중 하나라도 실패하면, 'Sequence Task'는 즉시 실패를 반환합니다.
3. 하위 작업이 성공적으로 완료되면, 'Sequence Task'는 순차적으로 다음 하위 작업을 실행합니다.
4. 모든 하위 작업들이 성공적으로 완료되면, 'Sequence Task'는 성공을 반환합니다.
Selector Task 1. 여러 하위 작업들 중 하나라도 성공하면 전체 작업이 성공한 것으로 간주합니다.
2. 하위 작업 중 하나라도 성공을 반환하면, 'Selector Task'는 즉시 성공을 반환합니다.
3. 하위 작업이 실패를 반환하면, 'Selector Task'는 순차적으로 다음 하위 작업을 실행합니다.
4. 만약 모든 하위 작업들이 성공하지 못하면, 'Selector Task'는 실패를 반환합니다.
Parallel Task 1. 모든 하위 작업(child tasks)을 동시에 실행합니다. 
2. 만약 하위 작업 중 하나라도 실패(failure)를 반환하면, Parallel Task는 모든 하위 작업을 종료시키고 실패를 반환합니다. 이는 하위 작업들이 동시에 실행되고 있으므로, 어느 하나가 실패하면 전체 작업의 실행을 중단시키는 것을 의미합니다.
3. 모든 하위 작업들이 성공(success)을 반환하면, Parallel Task는 성공을 반환합니다..

Behaviour Designer 사용 방법

Behaviour Designer를 다루기 위해서는 알아둬야 할 부분이 많습니다.

하나의 포스팅에서 전부 다루기에는 분량이 길어지기에 제가 공부하면서 가장 중요하다고 느꼈던 부분들만 언급하고 넘어가고자 합니다.

 

BT 컴포넌트 

Setting Name  Description 
Pause When Disabled true인 경우 컴포넌트가 비활성화될 때 비헤이비어 트리가 일시중지됩니다. false이면 비헤 이비어 트리가 종료됩니다.
Restart When Complete true인 경우 실행이 완료되면 비헤이비어 트리가 처음부터 다시 시작됩니다. false이면 비헤 이비어 트리가 종료됩니다.
Reset Values On Restart true인 경우 트리가 다시 시작될 때 변수 및 태스크 공용 변수가 원래 값으로 재설정됩니다.

 

BT 중지 및 재시작

public void EnableBehavior();
// pause:  현재 실행에서 비헤이비어 트리를 일시적으로 중지  
// EnableBehavior를 사용하여 재시작할 수 있습니다.
public void DisableBehavior(bool pause = false);

 

BT Manager

매니저

 

BT가 실행될 때 아직 비헤이비어 매니저가 생성되지 않은 경우 비헤이비어 매니저 컴포넌트가 부착된 새 게임오브젝트가 자동으로 생성됩니다. 비헤이비어 매니저는 씬에 존재하는 모든 비헤이비어 트리의 실행을 관리하는 역할입니다.

 

Update Interval 프로퍼티를 변경하여 비헤이비어 트리의 틱(Tick) 빈도를 제어할 수 있 습니다.

  • Every Frame : 업데이트 루프 내의 모든 프레임에서 비헤이비어 트리를 틱시킵니다.
  • Specify Seconds : 주어진 시간(초)마다 비헤이비어 트리를 틱시킵니다.
  • Manual : 비헤이비어 트리를 체크할 시점을 제어할 수 있습니다.

 

BT 주기

외워두시길..

 

OnAwake함수의 경우 Action이 처음 초기화 될 때만 실행되는 함수입니다.

Action이 동작될 때 마다 '처음' 호출부분은 OnStart함수입니다.

Action이 종료될 때 OnEnd함수가 호출됩니다.

 

BT Debug

BreakPoint

 

BreakPoint을 설정하여 해당 Action이 실행될 때 에디터를 중지시킬 수 있습니다.

BreakPoint가 설정되면 우측 사진처럼 빨간 동그라미가 표시됩니다.

비활성화

 

특정 Action 그룹을 비활성화 하고 싶을 때는 좌측 사진처럼 'X'버튼을 눌러 비활성화 시킬 수 있습니다.

 

로그

 

Action이 실행될 때 마다 Log을 출력하여 해당 Action의 상태를 트래킹 할 수 있습니다.

 

BT 변수(Variables)

태스크 사이에서 정보를 공유하는 태스크가 필요할 경우 변수를 사용하여 정보를 공유할 수 있습니다.

변수

 

Target이라는 전역 변수를 생성하여 Within Sight에서 찾은 타겟을 Move Towards에서 사용할 수 있게 했습니다.

서로 분리 된 Task에서 위와 같이 전역 변수를 이용하여 값을 공유할 수 있습니다.

 

전역 변수 외에도 동적 변수(Dynamic Variables), 공유 변수 생성(Creating Shared Variables)이 있습니다.

 

Task가 아닌 오브젝트로부터 지역 변수에 접근하는 방법은 다음과 같습니다. 

behaviorTree.GetVariable("MyVariable"); 
behaviorTree.SetVariable("MyVariable", value); 
behaviorTree.SetVariableValue("MyVariableName", value);

 

 

BT 조건부 중단(Conditional Abort)

우선순위가 낮은 Task가 Running 상태일때 우선 순위가 높은 Task에서 우선순위가 낮은 Task을 중단 시킬 수 있는 기능입니다.

Type

 

이해가 잘 가지 않는다면 아래 Event와 함께 보면 좀 더 이해하기 쉽습니다.

 

BT Event

이벤트는 Send Event 태스크와 Has Received Event 태스크로 신호를 보내고 받을 수 있습니다.

Has Received Event 태스크는 컨디셔널 태스크이며 이벤트가 수신되는 즉시 성공을 반환합니다.

Conditional Abort

 

처음 상황을 생각해보겠습니다. BT의 순서는 Has Received Event -> Fail -> Wait -> Send Event -> Idle -> Has Received Event -> Log Value 입니다.

 

만약 첫 번째 Sequence에 조건부 중단이 없었다면 Has Received Event가 True가 되었음에도 불구하고 실행되지 않아 로그를 출력하지 않습니다.

 

Lower Priority를 선택한 이유는 Has Received Event가 Idle의 우선순위보다 높기 때문입니다.

 


구매 링크

Behaviour Designer 에셋을 이용하여 복잡한 AI의 상태를  가독성 좋게 관리하는 것이 어떨까요?

뿐 만 아니라, Task를 재사용할 수 있다는 점에서 FSM의 단점을 벗어날 수 있습니다.

 

Behaviour Designer 에셋을 구매하기 앞서 저처럼 직접 FSM을 제작해보시고 한계점을 느껴보신 다음 Behaviour Designer 에셋을 구매하는 것을 적극 추천드립니다.

 

괜히 Behaviour Designer 에셋을 먼저 사서 BT의 장점을 느끼지 못하면 안되잖아요!

한 눈에 파악하기 쉽다

 

 

 

이 글은 어필리에이트 링크를 포함하고 있습니다. 

위 링크를 클릭하셔서 애셋을 구매하시면 저에게 수수료가 제공됩니다.
링크를 클릭하는 것으로는 수익이 발생하지 않습니다!
감사합니다!