언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (21) - 비헤이비어 트리를 이용한 적 AI 제작 2

ciel45 2023. 12. 30. 23:45

지난 포스팅에 이어서 BB_Enemy와 BT_Enemy의 내용을 작성하고자 한다.

 

현재 블랙보드의 키의 목록.

SelfActor는 기본적으로 있는 키이고, 나머지 3개는 New Key 버튼을 통해 직접 추가한 것이다.

각각의 의미는 다음과 같이 사용할 것이다.

  • SelfActor: 말그대로 자기자신을 의미. 여기서는 Actor로써의 BP_Enemy이다.
  • TargetActor: 인지할 대상인 액터를 의미. 여기서는 Actor로써의 BP_KannaCharacter가 될 것이다.
  • TargetLocation: AI가 타깃이 있을 것으로 추정하는 위치를 나타낼 것이다.
  • LastKnownLocation: 타깃이 시야에 있다가 사라졌을 때, 사라지기 전 마지막 위치를 나타낼 것이다.

 

 

비헤이비어 트리에서 이 키들을 사용할 것이다.

 

참고로 아래 이미지들에서 볼 수 있는 비헤이비어 트리의 노드들은 BTTask_~~~~ 를 제외한 모든 것들은 노드의 빈 공간에 우클릭하여 바로 생성할 수 있고, 후술할 Decorator는 노드 자체에 우클릭을 하여 생성할 수 있다. 혹시나 이 글로 비헤이비어 트리를 공부하시는 분이 계시다면 참고하시면 좋을 것 같다.

 

비헤이비어 트리의 시작부분이다. 최상단에 루트가 있는 것을 확인할 수 있다.

 

잘 보면 각 노드의 우측 상단에 번호가 있는 것을 볼 수 있다. 이것이 곧 실행 순서이다.

 

실행 순서는 트리를 전위 순회하는 것과 같다.

전위 순회라는 말이 어색하다면, 왼쪽 -> 오른쪽 순서라고 생각해도 될 것 같다.

 

Selector 노드는 자식들을 가지며, 자식들을 왼쪽 -> 오른쪽으로 쭉 실행시키면서 하나라도 성공할시 그만둔다.

자식 노드들의 실행 조건을 잘 설정하면 한 자식 노드만 수행되도록 '선택'할 수가 있는 것이다.

 

여기서는 Roam Sequence를 수행하여 성공했다면 그만두고, 실패했다면 Chase Selector로 넘어간다. (Sequence가 무엇인지는 바로 뒤에 적을 것이다.)

Roam Sequence 위에 달린 파란색으로 되어있는 것은 Decorator이다.

 

Decorator는 노드에 붙어서 블랙보드 키에 기반한 '조건'을 만들어주어, 이 조건을 만족하지 않는다면 노드를 abort 시킬 수 있다. (데코레이터를 선택한 뒤, 우측 상단의 Observer aborts를 설정해주자.)

여기서는 TargetActor가 Set 되어있지 않은 것이 데코레이터의 조건으로, 만약 TargetActor가 Set 된다면 Roam Sequence는 수행되지 않는다.

 

Sequence는 Selector와 비슷하게 자식들을 가지며 왼쪽 -> 오른쪽으로 실행시키는데, Selector의 방식과는 반대로 중간에 하나라도 실패할 시 그만둔다.

 

트리를 조금 더 확장하였다.

Roam Sequence 아래 Roam Selector가 있고,

Roam Selector의 자식으로 Investigation Sequence, BTTask가 있는 것을 볼 수 있다.

 

Investigation 시퀀스는 적이 플레이어가 있다고 의심되는 곳을 조사하도록 하기 위한 시퀀스이다.

데코레이터가 달려있는데, 조건이 TargetLocation is set인 것을 볼 수 있다.

 

따라서 TargetLocation에 값이 들어가있다면 Investigation을 수행할 것이고, 그렇지 않아 abort가 발생한다면 BTTask_MoveRandomLocation을 수행하게 될 것이다.

 

BTTask는 AI가 수행할 행동 그 자체를 나타낸다. 리프 노드로써의 기능을 한다.

MoveRandomLocation은 말그대로 주변의 랜덤한 위치로 이동하겠다는 의미이다.

BTTask_ MoveRandomLocation 는 직접 만들어둔 것으로, 내부 구조는 다음 포스팅에서 설명할 예정이다.

 

Chase Selector에는 Chase 시퀀스와 MoveTo(LastKnownLocation)가 달려있다.

 

Chase 시퀀스의 데코레이터의 조건이 TargetActor is set이므로, TargetActor에 값이 들어가있다면 시퀀스를 수행하여 MoveTo(TargetActor)를 수행하고, TargetActor에 값이 들어가있지 않다면 시퀀스는 실패하여, Chase Selector에서는 다음 자식인 MoveTo(LastKnownLocation)을 수행할 것이다.

 

풀어서 설명하자면, 플레이어를 직접 인지했을 때(TargetActor에 할당)는 곧장 플레이어쪽으로 이동하고, 그렇지 않았을 때는 마지막으로 본 위치로 이동하겠다는 의미이다.

 

 

마지막으로, Investigation 시퀀스에 3가지 자식을 달아주었다. 따라서 3가지 작업을 순차적으로 수행한다.

 

MoveTo(TargetLocation)을 먼저 수행한다. 즉, 플레이어가 있을 것으로 의심되는 위치로 이동한다.

 

Wait는 말 그대로 해당 위치에서 5초간 기다리겠다는 의미이다.

 

BTTask_ClearBlackboardValue는 말그대로 블랙보드의 키 값을 clear하는 태스크이다.

 

유의할 점이, clear하는 것과 0으로 만드는 것은 다르다. 위치 정보가 없는 것과 위치 정보가 (0, 0, 0)인 것은 엄연히 다른 것이다.

정보를 지우기 위해서는 블랙보드의 내장 기능을 사용해야 한다.

 

이 역시 BTTask_MoveRandomLocation과 함께 다음 포스팅에서 다룰 것이다.

 

 

 

다음 포스팅에서는 BTTask들의 내부 구현, AIController의 Sense Handling 함수들에 대해 다룰 것이다.