비헤이비어 트리(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가지가 있으며 그 내용은 언리얼 엔진 문서의 비헤이비어 트리 노드 참고서 : 태스크 문서에서 볼 수 있다.


 

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

반응형

2D 스프라이트 시퀀스 애니메이션


애니메이션은 게임에 생동감을 불어넣어 준다. 그런 애니메이션은 2D와 3D 애니메이션으로 나누어 지는데 3D 모델에 본을 심어서 움직이는 3D 애니메이션과 달리 2D 애니메이션은 고전적으로 시퀀스 이미지를 사용해왔다(최근 들어서는 2D 이미지를 부위 별로 나누고 거기에 본을 심어서 움직이는 스파인이나 라이브 2D 같은 방식의 애니메이션도 사용된다).



시퀀스 이미지란 위의 이미지처럼 진행될 애니메이션을 이미지로 그려서 나열해 놓은 것을 의미한다. 일반적으로는 위의 이미지처럼 하나의 시퀀스 이미지를 뽑아서 가져온 뒤에 오프셋을 이동시키는 방법으로 시퀀스 애니메이션을 사용했지만 유니티에서는 시퀀스 이미지를 각 프레임별로 이미지를 잘라서 사용한다.


잘라서 가져온 스프라이트 이미지

유니티 엔진에서 스프라이트 시퀀스 애니메이션은 크게 2가지 용도로 사용이 가능하다. 하나는 2D게임을 제작할 때, 2D 오브젝트에 애니메이션을 넣는 것이고, 다른 하나는 UI에서 2D 이펙트를 주거나, 기존의 키 애니메이션이 아닌 방식으로 UI에 애니메이션을 넣고 싶을때 사용하는 것이다.


이 2D 시퀀스 애니메이션을 사용하는 방법은 매우 간단하다.



우선은 간단하게 시퀀스 애니메이션을 적용할 2D 스프라이트 오브젝트를 생성하자.



그리고 Hierarchy 창에서 생성한 스프라이트 오브젝트를 선택하고 애니메이션 창을 열면 해당 오브젝트에는 아직 애니메이션이 없음을 볼 수 있다. 여기서 Create 버튼을 누르면 새로운 애니메이션을 만들 수 있다.



새로운 애니메이션을 생성한 이후에 한 애니메이션에 사용될 시퀀스 이미지들을 애니메이션 창에 드래그&드롭하면 그 생성한 애니메이션 클립에 시퀀스 이미지들이 들어가면서 스프라이트 시퀀스 애니메이션이 완성된다. 참고로 1프레임당 시퀀스 이미지 1장이 들어가기 때문에 적당한 속도로 애니메이션을 출력하기 위해서는 애니메이션의 속도 조절을 해야할 것이다. 다음 이미지가 0.5배속으로 만든 스프라이트 애니메이션이 적용된 모습이다.


2D 스프라이트 시퀀스 애니메이션을 사용할 때,시퀀스 이미지의 프레임이 늘어나면 애니메이션이 부드러워 보이고 퀄리티가 높아지지만 그만큼 더 많은 리소스를 사용하게 된다는 점을 기억해야 한다.


또한 시퀀스 애니메이션 작업을 할 때는 애니메이션에 사용되는 시퀀스 이미지들을 한꺼번에 선택해야 하는 경우가 많은데, 만약 시퀀스 이미지들의 해상도가 높거나 이미지들의 개수가 너무 많은 경우, 이미지들을 선택하는 것만으로도 유니티 엔진이 버벅대는 사태가 발생할 수 있다.


유니티 엔진의 Project 뷰에서 다량 혹은 고해상도의 이미지를 선택해야하는 작업의 경우에는 Inspector 뷰 우측 상단의 자물쇠 표시를 눌러서 잠궈주고, 하단의 프리뷰 창을 내려주는 것이 많은 도움이 될 것이다.


반응형
  1. 아이윤맨 2020.11.05 13:43 신고

    링크해갑니다~

+ Recent posts