본문 바로가기

언리얼 BluePrint 정리

07/07 학습 정리 ( Behavior Tree, BlackBoard )

AI

 

싱글게임에서 적, 마을주민, 조력자 등 플레이어가 조종하는것이 아닌 NPC가 존재하는데 이러한 NPC들은 행동패턴을 정해주고 컴퓨터가 그 패턴을 따라 움직이는 형태이다.

언리얼에서 AI의 행동 패턴을 만들려면 비헤이비어 트리(Behavior Tree), 블랙보드(BlackBoard)를 사용해야한다.

BehaviorTree는 루트(Root), 컴포짓(Composite), 태스크(Task), 데코레이터(Decorator), 서비스(Service)  노드가 존재한다.

 

Root

 

비헤이비어 트리의 시작점으로 아래로 하나의 연결만 가질수 있어 컴포짓을 연결하지 않으면 단 하나의 태스크만 사용 할 수 있다. 블랙보드는 루트에서만 적용 가능하다.

 

 

Composite

 

컴포짓(Composite) 노드는 분기의 루트와 분기가 실행되는 방식의 기본 규칙을 정의.

컴포짓에는 데코레이터(Decorator)를 적용하여 분기 진입을 수정하거나 실행을 중도에 취소할 수 있다. 

컴포짓에는 자손이 실행 중일 때만 활성화되는 서비스(Service)를 어태치할 수도 있다. 

 

 

Selector

Selector아래의 태스크중 하나라도 성공하면 실행 중단

OR연산과 비슷하다.

(성공 : 하나라도 성공, 실패 : 전부 실패)

 

Sequence 

Sequence아래의 태스크중 하나라도 실패하면 실행 중단

AND연산과 비슷하다.

(성공 : 전부 성공, 실패 : 하나라도 실패)

 

Simple Parallel

Simple Parallel은 메인 Task, 서브 Task가 존재하며

양쪽을 병렬 실행 시키며 메인 Task가 중단되면

Detail에 있는 Finish Mode라는 사전 설정에 따라 서브 Task를 즉시 중단하거나 서브 Task가 중단 될 때까지 대기한다.

 

 

 

 

Task

 

태스크는 AI를 이동하거나 딜레이를 걸거나 애니메이션을 재생하는 등 각종 '작업'을 수행하는 노드

 

기본으로 제공되는 Task가 있으며 필요에 따라서는 사용자가 새태스크를 정의 할 수 있다

 

트리 순회 방식

 

트리의 순회 방식에는 전위, 중위, 후위, 계층 순회 방식이 있는데 비헤이비어 트리는 기본적으로 전위순회 방식을 사용한다.

 

순서는 트리의 노드에 막대기가 전위는 9시, 중위는 6시, 후위는 3시에 있다고 가정하고 루트로 부터 반시계 방향으로 돌면서 막대기를 건드리는 순서대로 진행이된다.

자세한건 다른 블로그 참조 ( https://withhamit.tistory.com/282 )

 

BlackBoard

 

태스크의 Move To 태스크를 보면 움직여라 하는 태스크인데 되는데 어디로 움직일지 목표가 없다.

이런식으로 태스크에서 사용할 변수를 선언해주는곳이 블랙보드다.

 

 

블랙보드를 생성하면 기본으로 SelfActor가 있고 MoveTo에서는 위치를 필요로 하기에 벡터변수를 생성

 

Service

 

서비스(Services)  컴포짓(Composite) 또는 태스크(Task) 노드에 어태치되며, 분기가 실행 중인 동안 정의된 빈도로 실행. 보통 블랙보드의 확인과 업데이트에 사용된다.

서비스 내부에서 Blackboard Key Selector 유형의 변수를 생성하고 인스턴스 편집가능으로 세팅하여

비헤이비어 트리의 서비스의 디테일에서 블랙보드의 변수에 값을 넣어준다.

Blackboard Key Selector로 만든 변수는 무슨 자료형인지 모르기에 서비스 내부에서 Set Blackboard Value as 자료형으로 값을 넣어준다.

 

 

Decorator

 

다른 비헤이비어 트리 시스템에서는 조건식이라고도 알려진 데코레이터(Decorator)  컴포짓(Composite) 또는 태스크(Task) 노드에 어태치되며, 트리에 있는 분기 또는 단일 노드를 실행할 수 있는지 여부를 정의합니다.

 

 

BlackBoard 데코레이터를 추가하여 Destination의 값이 정의 되어있지않다면 진행, 정의되어 있다면 실패 이런식으로 분기를 짤수도 있고 Cooldown 데코레이터처럼 태스크에 쿨다운을 만들어서 설정된 시간이 다 지나지 않았는데 노드에 접근시 실패 이런식으로 짤수도 있다.

 

 

데코레이터는 서비스보다 우선순위가 높기 때문에 루트 바로 밑에 데코레이터와 서비스를 추가해도 데코레이터가 먼저 실행되기 때문에 세팅이 불가능하여 루트 바로 밑 데코레이터는 항상 -1, 즉 실행되지 않는다.