[UE5] Environment Query System(EQS)을 이용한 AI 움직임 구현

kkado·2024년 9월 23일
0

UE5

목록 보기
63/63
post-thumbnail

AI 몬스터의 동작을 구현할 때에는 행동 트리와 블랙보드를 이용할 수 있다. 블랙보드에 여러 가지 키를 만들고 런타임에서 키들의 값을 갱신/초기화 하는 등의 작업을 진행할 수 있고, 그 키값들에 따라서 행동 트리가 분기될 수 있도록 Behavior Tree Service를 각 노드에 설정할 수 있다.

여기에 좀 더 심화된 움직임을 한번 구현해 보고자 한다.

문제 상황은 다음과 같다. 만약 원거리 공격을 하는 AI 캐릭터가 벽 너머에 있는 캐릭터를 공격하고 싶다고 했을 때, 그냥 직선으로 공격을 하면 당연히 벽에 가로막힐 것이다. 이 때는 벽을 돌아서 적 캐릭터를 볼 수 있는 각으로 이동한 뒤에 공격을 해야 한다. 벽을 돌아서 이동한다고 함은 어디로 어떻게 이동할 것인지를 정해야 한다. 이 때 사용할 수 있는 것이 Environment Query System이다.

Environment Query System

Environment Query System (이하 EQS)은 AI 캐릭터가 환경에서 특정 데이터나 조건을 기반으로 행동을 결정할 수 있도록 한다. EQS는 '쿼리' 즉 질의를 통해 주어진 환경에서 선택할 수 있는 여러 옵션들을 평가해, 가장 적합한 대상을 찾도록 한다.

EQS는 Query와 Generator, Test, 그리고 Score로 그 구성요소를 나눌 수 있다.

쿼리는 여러 개의 점으로 구성되며, 각각의 점은 평가 기준에 따라 점수를 받는다.

제너레이터는 평가할 점을 생성할 위치를 의미한다.

테스트는 생성된 점에 대해 평가를 거쳐 점수를 매긴다. AI는 이 점수를 기준으로 가장 적합한 옵션을 선택한다. 이 평가 요소는 거리, 가시성 등등 다양한 조건이 적용될 수 있다.

사용 예시

TestingPawn 추가

먼저 Character의 하위 클래스인 EQSTestingPawn 을 만들어 월드에 배치한다.

그리고 Articifial Intelligence -> Environment Query 를 선택해 EQ를 만든다.

EQ를 만들면 이런 식으로 마치 행동트리나 애니메이션 블루프린트와 유사한 화면이 나오게 되며, 여기에 다양한 제너레이터를 연결할 수 있다.

PathingGrid를 선택하고 월드를 살펴보면, 아래 그림과 같이 testing pawn 주변으로 수많은 구들이 생성된 것을 확인할 수 있다.

제너레이터 노드를 잘 살펴보면 그 정보들이 다 들어있다. 먼저 around Querier는 질의하는 대상 주변에 생성한다는 뜻이고 radiusspace between은 구를 생성할 범위와 간격을 뜻한다.

디테일 패널에서 이것을 조정할 수 있다.

예를 들어 GridHalfSize를 300으로, SpaceBetween을 100으로 설정하면,

절반 (즉 사분면당) 300의 길이를 가지고, 각각의 구는 100의 간격을 가지게 된다.

여기서 간격을 150으로 올리면

듬성듬성하게 구가 생성된다.

Test 추가

우클릭 -> Add Test 를 통해 테스트를 생성할 수 있으며 어떤 요소를 평가할지를 선택 가능하다. Trace를 생성해서 해당 위치에서 다른 액터를 볼 수 있는지를 테스팅 해 보자.

앞에 있는 캐릭터를 볼 수 있는지의 여부를 테스팅 할 것이다. 먼저 컨텍스트를 생성해서 어떤 캐릭터를 대상으로 할지를 알아야 한다.

모든 AuraCharacter를 찾는 컨텍스트를 만들고 Trace Context에 추가한다.

Test Purpose에는 Filter Only로 설정한다.

특정 위치에 대해 해당 폰을 볼 수 없도록 구조물을 설치하면, 볼 수 있는 지점에는 1로, 그렇지 않은 지점에는 0으로 점수가 매겨진 것을 볼 수 있다.

여기에 한가지 테스트를 더 추가해서 거리까지 함께 조사해 보자.

Distance 테스트를 추가하고 DistanceTo를 PlayerContext로 변경하면

위 그림과 같이 폰까지의 거리에 따라 점수가 매겨진 것을 볼 수 있다. 0~1까지의 범위 내에서 정규화된 값을 갖는다.

이것을 실제 게임에 응용한다면, 현재 해당 지점에서 캐릭터를 볼 수 없지만 가장 점수가 높은 점 (캐릭터를 볼 수 있으면서, 가장 근처의 점)으로 이동, 즉 위의 사진에서는 0.81의 점수를 갖는 점으로 이동하도록 하면, 캐릭터를 볼 수 있는 위치로 이동하는 AI를 가질 수 있다.

행동 트리에 적용한 모습은 위와 같다.

profile
베이비 게임 개발자

0개의 댓글