비헤이비어 트리(Behavior Tree)


작성 기준 버전 :: 4.21.1


AI는 잠입 액션 게임에서는 수색자가 플레이어를 찾기 위해서 주변을 수색하고, 슈팅 게임에서는 총알이 떨어지면 탄창을 갈고 체력이 부족해지면 회복 아이템을 사용하고 사격을 받으면 엄폐물 뒤로 숨는 등의 게임의 난이도를 적절하게 조절하고 게임의 생명력을 불어넣는 역할을 한다.


못 만든 게임은 여러 가지 요소가 플레이어를 거슬리게 만들지만 멍청하게 구는 AI 역시 게임의 재미를 떨어뜨리는 아주 중요한 요소이다. 낮은 난이도라고 AI가 플레이어가 눈 앞에 있어도 멍청하게 서있거나 수 초가 지나서야 반응하거나, 높은 난이도라고 플레이어가 대응할 시간도 없이 죽여버리는 것은 AI를 통한 난이도 조절에 완전히 실패한 경우라고 볼 수 있다. AI를 통한 난이도 조절을 제대로 하기 위해서는 무작정 반응 속도가 빠른 것이 아니라, 플레이어의 심리를 교묘하게 찌르는 전략적인 움직임을 AI가 할 수 있도록 만들어야 한다.


앞에서 사설이 길었지만, 이러한 AI를 제작하기 위한 방법으로는 여러 가지가 있다. 간단한 방법으로는 상태 머신(State Machine)부터 어려운 방법으로는 머신 러닝(Machine Learning)까지 말이다. 이러한 여러 가지 기법 중에서 언리얼 엔진은 비헤이비어 트리(Behavior Tree)라는 방식으로 AI 기능을 제공한다.


 

언리얼 엔진에서 제공하는 비헤이비어 트리는 블랙보드(BlackBoard)와 비헤이비어 트리(Behavior Tree), 이 두 가지 유형의 에셋의 조합으로 이루어진다.



블랙보드는 AI의 기억 저장소로 AI가 판단을 내리는데 필요한 데이터들을 저장하는 역할을 하고, 비헤이비어 트리는 블랙보드가 가진 데이터를 토대로 의사결정을 내리고 이를 실행으로 옮기는 역할을 한다.



비헤이비어 트리 노드의 종류


비헤이비터 트리의 노드는 루트(Root), 컴포짓(Composite), 데코레이터(Decorator), 서비스(Service), 태스크(Task). 이렇게 다섯 가지 종류가 있다.



루트(Root)


 

루트 노드는 비헤이비어 트리의 시작점이며, 아래쪽으로 향하는 단 하나의 연결만을 가질 수 있고, 데코레이터나 서비스를 덧붙일 수 없다.

 

 

루트 노드 자체에는 별다른 프로퍼티가 없지만, 루트 노드를 선택하면 디테일 패널에서 이 비헤이비어 트리에서 사용할 블랙보드 애셋을 설정할 수 있다.



컴포짓(Composite)


컴포짓 노드는 해당 분기가 실행되는 기본 규칙을 정의한다. 데코레이터를 통해서 분기로 들어가는 조건을 변경하거나, 중간에 실행이 취소되도록 만들거나, 서비스를 덧붙여서 컴포짓 노드의 자손이 실행되는 동안 서비스가 작동되도록 만들 수도 있다.


컴포짓 노드는 셀렉터(Selector), 시퀀스(Sequence), 심플 페러렐(Simple Parallel). 세 가지 종류가 있다.


셀렉터(Selector)


 

셀렉터 노드는 선택기 노드라고도 하며, 자손 노드를 왼쪽에서 오른쪽 순서로 실행하며, 자손 노드 중 하나가 실행에 성공하면 자손의 실행을 멈춘다. 셀렉터의 자손이 실행에 성공하면 셀렉터의 작동은 성공한 것이 되고, 모든 자손의 실행이 실패하면 셀렉터의 작동은 실패한 것이 된다.


시퀀스(Sequence)


 

시퀀스 노드는 자손 노드를 왼쪽에서 오른쪽 순서로 실행하며, 자손 중 하나가 실패하면 자손의 실행을 멈춘다. 자손 노드가 실행에 실패하면 시퀀스는 실패하며, 모든 자손 노드가 실행에 성공해야 시퀀스가 성공한다.


심플 페러렐(Simple Parallel)


 

심플 페러렐 노드는 단순 병렬 노드라고도 하며, 전체 노드 트리와 동시에 하나의 태스크를 실행할 수 있다. 예를 들어, 적을 향해 이동하면서 사격한다던지 하는 행동을 할 수 있게 해준다.


Finish Mode 설정을 통해서 메인 테스크가 완료되면, 서브 트리를 중단시키고 즉시(Immediate) 노드를 완료시킬지, 아니면 서브 트리를 완료할 때까지 지연(Delayed)시킬지를 설정할 수 있다.



데코레이터(Decorator)


 

데코레이터는 다른 비헤이비어 시스템에서 조건절이라고도 부르는 것으로, 컴포짓이나 태스크에 붙여서 분기나 노드가 실행될 것인지를 정의한다.



데코레이터의 종류는 기본적으로 16가지가 있고 필요하다면 비헤이비어 트리 에디터의 상단 메뉴 바에서 새 데코레이터 버튼을 클릭해서 커스텀 데코레이터를 추가할 수 있다.


기본적인 데코레이터의 종류는 언리얼 엔진 문서 중 비헤이비어 트리 참고서 : 데코레이터에서 확인할 수 있다.



서비스(Service)




서비스는 컴포짓 노드에 분기가 실행되는 동안 정해진 빈도에 맞춰서 실행된다. 보통 검사를 하고 그 검사를 바탕으로 블랙보드의 내용을 업데이트하는데 사용된다.


 

비헤이비어 트리 에디터의 상단 메뉴 바에서 새 서비스 버튼을 클릭해서 커스텀 서비스를 추가할 수 있다. 기본적인 서비스 노드의 종류로는 Default Focus와 Run EQS가 있다.



태스크(Task)


 

태스크는 AI의 이동이나 블랙보드의 값 조정과 같은 작업을 하는 노드로 이 노드에도 데코레이터가 붙을 수 있다.


태스크 노드의 종류에는 7가지가 있으며 그 내용은 언리얼 엔진 문서의 비헤이비어 트리 노드 참고서 : 태스크 문서에서 볼 수 있다.


 

비헤이비어 트리 에디터의 상단 메뉴 바에서 새 서비스 버튼을 클릭해서 커스텀 태스크를 추가할 수 있다.

반응형

+ Recent posts