EQS (Environment Querying System) 란?

EQS는 게임속 환경에 대해 질문을 생성하고, 질문을 던지는 하나의 방법이다.

근본적인 아이디어는 게임 기획자들이 쉽게 배경이나 환경에 관련된 질문을 만들 수 있게 도와주려는 노력에서 시작되어 만들어진 툴이다.

UE4 에서 EQS는 일종의 툴로 이해하면 편하다. Question Template이라고 불리는 Query Asset을 만들고, 이 애셋들을 실시간으로 사용할 수 있게 해준다.

게임속에서는 AI 액터들이 의사결정을 내리기 위해 EQS 시스템을 이용해 게임 월드에 질문을 던지는 것이 대부분이다.

예를 들면 반경 X 미터 내에 적이 어디있는지나 적을 피해서 숨을 수 있는 엄호 위치를 알려주는 등등의 게임 월드내에 심겨진 각 지점들에게 물음을 던지면 각 지점들은 자신이 얼마나 질문에 적합한 위치인지 알려주는 개념이다.

Cry Engine 에서는 Tactical Point System, Kill Zone 게임에서는 Dynamic Terrain Analysis 라는 용어로 비슷한 기술들이 있다.

EQS 에서 각각의 Query는 적어도 하나 이상의 Option으로 구성된다.

Option들은 왼쪽에서 오른쪽으로 순차적인 우선순위를 지니고 있다. 만약 첫번째 Option이 어떠한 결과도 만들지 못해 Skip되거나 Failed 된다면, 두번째 Option이 실행되는 방식이다.

그리고 각각의 Option들은 단 하나의 Generator를 갖고있다. Generator는 고려해야할 Item들을 생성시키거나 모으는 역할을 한다.

각각의 Generator는 Item들에게 점수(Score)를 주거나 필터링 하는데 사용되는 일종의 Test 들을 갖고있다.

EQS의 핵심은 Option, Generator, Test, Query 라고 보면 된다. 모두 고유한 명사이기 때문에 상관관계를 한 번만 이해하면 아주 수월하게 작업할 수 있다.

EQS는 아주 쉽게 확장할 수 있다. 당연하게도 Blueprint로 작업할 수도 있고, 직접 필요하거나 원하는 Generator, Context, Test 등등을 만들어 낼 수 있다.

(아직까지 Test 들은 C++ 로만 만들 수 있다. Blueprint에서의 연산 속도 문제 떄문에 지원하지 않는다고 한다.)

EQS 사용해보기

EQS는 언리얼 4.9 버전부터 존재했지만, 아직까지도 실험적인 기능으로 남아있다. 플러그인처럼 엔진을 껏다 켜야하는 것은 아니지만, 에디터 설정에 가서 직접 EQS를 활성화 해서 사용해야 한다.

EQS를 활성화 했다면, 이제 EQS를 한 번 사용해볼 차례이다.

EQS에서 테스트를 위해 EQS Testing Pawn을 상속받은 Blueprint Class를 하나 생성해보자.

EQS Testing Pawn 이란?

EQS가 실제 무엇을 하고 있는지 확인할 수 있도록 해주는 특수한 Pawn 클래스이다.

EQS의 정확한 구성이 생성되는 것의 크기와 모양을 정의하고, 항상 색 구체로 표현 된다.

구체의 색상은 초록에서 빨강으로, 실행된 EQS의 다양한 테스트 결과를 나타낸다. 파란색 구체는 실패 또는 Trace 테스트와 같은 bool 유형 테스트에서 false를 반환한 것을 나타낸다.

EQS Testing Pawn을 상속받아 나는 EQS_TEST_PAWN 이라는 캐릭터를 하나 상속받았다.

생성 후 블루프린트 클래스를 EQS Testing Pawn의 프로퍼티를 설정한다. (4.22.3 기준)

Query Template 여기에서 우리가 사용하길 원하는 하나의 Query Asset을 선택할 수 있다.
Query ConfigQuery Params 를 대체해 생긴 프로퍼티이다.
네임드 값을 EQS에 전달해 그 세팅을 빠르게 조절할 수 있도록 한다.
Time Limit Per StepEQS Manager는 시분할 방식으로 Query를 처리한다.
이 옵션을 통해 주어진 시간에 얼마나 자주 Query를 던질지 결정할 수 있다.
Step to Debug DrawTime Limit Per Step에 설정된 시간마다 생성된 결과들을 화면상에 디버깅해 보여줄지 에 대한 설정이다.
Highlight Mode잘 모르겠다…
Draw Lables체크되면 모든 Item의 디버그 레이브를 그려준다.
Test에 실패한 Item은 실패한 Test 명을 보여주고, 나머지는 그 Test의 Score를 Item에 표시해준다.
Draw Failed Items체크되면 Test에 실패한 Item들을 어두운 파란색으로 표시해준다.
Re Run Query Only on Finish마지막 변화 (Pawn의 움직임)가 발생한 후 Pawn을 Testing 한다. 비활성화된 경우에는 Pawn이 움직일 때 마다 연속해서 Query를 발생시킨다.
Query가 복잡하지 않고, 시스템의 성능이 좋다면, 환경의 변화에 따라 Query의 결과가 어떻게 변하는지 역동적으로 확인할 수 있어 좋다.
Should be Visible in Game시뮬레이션 모드에서 Pawn을 이동시킬 수 있도록 한다.
Tick During Game런타임에 Tick을 돌지에 대한 여부이다.
Querying ModeSingle Result : Step to Debug Draw 프로퍼티 리스트에 들어가있는 아이템의 결과만 보여준다.
All Matching : EQS의 최종적인 Query들의 모든 값이 계산된 결과를 보여준다.

EQS 애셋 만들기

EQS Testing Pawn과 EQS의 기능들을 다루기 전에 가장 먼저 Environment Query 애셋을 생성해야 한다.

생성법은 아주 간단하다. 콘텐츠 브라우저에서 마우스 오른쪽 클릭 -> 인공지능 -> 인바이런먼트 쿼리 를 눌러 만들면 된다.

나는 EQ_GoodPlaceToHide 라고 이름지었다.

만드어지 애셋을 더블클릭하면, Behavior Tree를 만지며 봤을법한 EQS Query Editor가 열린다.

내가 만들 쿼리는 간단하게 X Unit 내의 거리에서 나의 위치에서는 보이지 않는 지점, 그리고 그 지점들이 멀면 멀수록 좋은 지점이라는 조건의 쿼리를 만들겠다.

먼저 Generator를 만든다.

PathingGrid Generator를 만들어 쿼리를 날릴 공간을 잡았다.

이제 Task를 추가해 Test를 만들자.

Generator에 오른쪽 클릭을 해서 Test를 추가할 수 있다.

필요한 Task들만 추가해주고 설정은 프로퍼티를 변경해 진행하면 된다.

가장 먼저 Generator의 값을 설정해보겠다.

Generator의 속성값들은 각 Generator마다 다르다. 하지만 하나만 이해하면 나머지들은 특화된 한두가지의 항목만 보면 된다.

Pathing Grid Genetator는 Querier (질문자)를 중심으로 지정된 반경 내의 Grid를 생성해 내는 기능을 한다.

다음으로 볼 것은 Distance Task 이다.

우리가 원했던 X Unit 안에 존재하는 Item 들을 찾기 위해 필요하다.

상단의 Test Purpose를 Score Only로 설정해주면 된다.

그리고 마지막으로 Trace Test는 Querier가 보이지 않는 지점을 알기 위해 설정하는 Task이다.

두 Task 를 합쳐, X Unit 내에서 Querier가 보이지 않는 지점을 찾는 Test가 완성되었다.

이제 테스트를 해볼 시간이다.

이전에 만들어둔 EQS_TEST_PAWN 의 EQS 설정 탭에서 Query Template를 방금 만든 EQ_GoodPlaceToHide로 설정한다.

그리고 맵 상에 배치하면 이렇게 아이템들이 보이게 된다.

score들 때문에 너무 어지러우니 EQS_TEST_PAWN 의 설정에서 Draw Lables를 체크 해제해보자.

실시간으로 변화하는 EQS Item들을 보고싶다면 Re Run Query Only on Finished Move를 체크 해제하면 된다.

이렇게 만들어진 EQS Item Data들을 불러 사용하기만 하면 된다.