EQS의 기본 활용법
EQS의 제너레이터·컨텍스트·테스트로 후보 위치를 만들고 필터링·점수화해 AI 엄폐 지점을 선택합니다.
비헤이비어 트리로 "공격받으면 엄폐한다"는 판단까지는 만들 수 있습니다. 그런데 막상 엄폐하려면 어디로 숨을지를 정해야 합니다. 주변의 벽과 상자 가운데 플레이어의 시야를 가려 주면서, 실제로 걸어갈 수 있고, 플레이어와 적당히 떨어진 곳을 골라야 합니다. 이런 위치를 레벨마다 손으로 지정해 두면 레벨이 바뀔 때마다 다시 지정해야 하고, 플레이어가 어디 있느냐에 따라 좋은 위치가 달라지는 것도 반영하기 어렵습니다.
언리얼 엔진은 이 질문을 실행 중에 계산하는 환경 쿼리 시스템(Environment Query System, EQS)을 제공합니다. 이 글에서는 EQS를 이루는 제너레이터, 컨텍스트, 테스트의 역할을 살펴보고, 후보 위치를 만들어 걸러 내고 점수를 매겨 AI의 엄폐 지점을 고르는 쿼리를 만듭니다. 그리고 그 결과를 비헤이비어 트리에서 써서 AI를 이동시키는 데까지 연결합니다.
AI가 "어디로" 갈지 묻는 시스템
EQS는 AI가 주변 환경을 분석해, 정한 기준에 따라 가장 알맞은 위치나 대상을 찾게 해 주는 시스템입니다. 비헤이비어 트리가 무엇을 할지를 정한다면, EQS는 그 행동을 어디서 누구를 대상으로 할지를 답합니다. AI가 환경을 살피는 눈이자 탐색 도구라고 생각할 수 있습니다.
EQS를 쓰면 AI가 플레이어를 따라가는 데서 그치지 않고, 엄폐할 위치, 아이템을 주울 위치, 공격하기 좋은 위치, 달아날 방향 같은 것을 스스로 판단합니다. 거리, 시야, 경로가 있는지, 특정 태그가 있는지 같은 여러 조건을 함께 고려해 후보를 걸러 내고 점수를 매기므로, 지형이나 오브젝트, 다른 AI의 위치가 바뀌어도 그때그때 의미 있는 위치를 찾을 수 있습니다. 한 번 만든 쿼리는 여러 AI 캐릭터에서 다시 쓸 수 있습니다.
공식 문서에 따르면 EQS는 언리얼 엔진 5의 AI 도구에 속한 기능이며, 에디터에서 쓰려면 기능을 켜야 할 수 있습니다. 콘텐츠 브라우저에 EQS 관련 메뉴가 보이지 않으면 Plugins 창에서 Environment Query Editor를 켭니다.
쿼리를 이루는 요소
EQS의 쿼리는 몇 가지 요소로 이루어집니다. 쿼리 자체는 환경 쿼리(Environment Query) 에셋으로 만들고, 그 에셋을 EQS 에디터에서 열어 아래의 요소들을 조합해 설계합니다.
제너레이터(Generator)는 쿼리를 실행할 때 환경에서 어떤 항목(item)을 만들어 낼지 정합니다. 이렇게 만든 항목이 나중에 걸러지고 점수를 받는 후보가 됩니다. Points: Grid는 기준 위치 주변의 격자에 후보 위치를 만들고, Points: Circle과 Points: Donut은 원둘레나 여러 겹의 고리 모양으로 후보를 만듭니다. Actors of Class는 지정한 클래스의 액터를 후보로 찾으며, 검색 반경을 제한할지와 검색 중심을 설정할 수 있습니다.
컨텍스트(Context)는 제너레이터가 후보를 만들거나 테스트가 조건을 검사할 때 기준으로 삼는 위치나 대상을 제공합니다. Querier는 쿼리를 실행한 주체로, 이 글처럼 비헤이비어 트리에서 실행하면 AI가 조종하는 폰입니다. Item은 지금 검사하고 있는 후보 자체입니다. 플레이어나 블랙보드의 목표처럼 다른 대상을 기준으로 삼으려면 사용자 정의 컨텍스트를 만들어야 합니다. 블랙보드에 TargetActor라는 키가 있다고 같은 이름의 컨텍스트가 저절로 생기지는 않습니다.
테스트(Test)는 제너레이터가 만든 각 후보에 조건을 검사해, 후보를 걸러 내거나(filter) 점수를 매깁니다(score). Distance는 후보와 컨텍스트 사이의 거리를, Pathfinding은 경로가 있는지와 그 비용이나 길이를, Trace는 후보와 컨텍스트 사이에 충돌하는 물체가 있는지를 검사해 시야가 가려졌는지 판단하며, Dot은 두 방향의 내적을 비교합니다. 공식 문서에 따르면 걸러 내는 테스트가 점수를 매기는 테스트보다 먼저 실행되어 점수를 매길 후보의 수를 줄이며, 한 제너레이터 안에서 테스트를 나열한 순서는 결과에 영향을 주지 않습니다.
마지막으로 EQS가 찾아낸 가장 좋은 위치나 대상은 블랙보드 키에 저장됩니다. 그 뒤 비헤이비어 트리의 태스크가 이 키의 값을 읽어 AI의 행동을 지시합니다. 예를 들어 엄폐 위치를 BestCoverLocation 키에 저장하면 Move To 태스크가 그곳으로 AI를 이동시킵니다.
엄폐 위치를 찾는 쿼리 만들기
이제 플레이어에게 공격받을 때 AI가 숨을 위치를 찾는 쿼리를 만들어 보겠습니다. 목표는 AI 주변에서, AI가 걸어갈 수 있고, 엄폐물이 플레이어의 시야를 가려 주며, 그중에서 플레이어와 멀리 떨어진 위치를 찾는 것입니다.
쿼리 에셋과 플레이어 컨텍스트
콘텐츠 브라우저의 빈 곳을 우클릭해 Artificial Intelligence > Environment Query를 고르고, 이름을 EQS_FindCover로 정한 뒤 더블클릭해 EQS 에디터를 엽니다.
다음으로 플레이어를 기준으로 삼을 컨텍스트를 만듭니다. EnvQueryContext_BlueprintBase를 부모로 하는 블루프린트 클래스 BP_PlayerCharacter_Context를 만들고, Provide Single Actor 함수를 오버라이드해 Get Player Character(Player Index 0)가 돌려주는 유효한 캐릭터를 반환하게 합니다. 이 예제는 로컬 플레이어 한 명을 기준으로 하며, 멀티플레이 게임이라면 쿼리를 실행한 AI에게 맞는 목표를 골라 반환해야 합니다.
후보 위치 만들기
EQS 에디터의 Root에 Points: Grid 제너레이터를 연결하고, Generate Around를 Querier로, Grid Half Size를 1000으로, Space Between을 200으로 설정합니다. 단위는 cm이므로 AI를 중심으로 한 변이 20m인 정사각형 안에 2m 간격으로 후보가 만들어집니다.
제너레이터의 Projection Data는 레벨의 내비메시에 맞춥니다. 이 설정은 후보 위치를 내비메시 위로 투영해 바닥에 붙이는 일을 하지만, 투영되었다고 AI가 그 위치까지 실제로 갈 수 있다는 뜻은 아닙니다. 벽 너머의 분리된 바닥에도 투영될 수 있기 때문이며, 도달할 수 있는지는 다음 테스트에서 따로 확인합니다.
거르고 점수 매기기
제너레이터에 Pathfinding 테스트를 붙이고, 검사 방식을 Path Exist로, Context를 Querier로, Path from Context를 true로 둡니다. Test Purpose를 Filter Only로, Bool Match를 true로 설정하면 AI에서 경로가 있는 후보만 남습니다.
이어서 Trace 테스트를 붙이고, Context를 BP_PlayerCharacter_Context로, 채널을 Visibility로, 형태를 Line으로, Only Blocking Hits를 true로 설정합니다. 여기서도 Filter Only와 Bool Match true로 두면, 후보와 플레이어 사이를 무언가가 막고 있는 후보, 즉 플레이어의 시야에서 가려진 후보만 남습니다. Item Height Offset과 Context Height Offset은 눈높이와 엄폐물 높이에 맞추고, 바닥이나 AI 자신의 몸을 차폐물로 잘못 판단하지 않는지 확인합니다.
마지막으로 Distance 테스트를 붙이고, Distance To를 플레이어 컨텍스트로, Test Purpose를 Score Only로, Scoring Equation을 Linear로 두고 Scoring Factor를 양수로 설정합니다. 그러면 앞의 두 필터를 통과한 후보 가운데 플레이어에게서 먼 위치일수록 높은 점수를 받습니다. 같은 양수 가중치에서 Inverse Linear를 고르면 반대로 가까운 위치를 더 좋게 봅니다.
설정을 마쳤으면 레벨에 EQS Testing Pawn을 놓고 이 쿼리를 지정해, 어떤 후보가 만들어지고 걸러지며 몇 점을 받는지를 레벨 안에서 확인합니다. 이 쿼리가 고르는 위치는 만들어진 후보와 이 설정 안에서 가장 좋은 위치일 뿐이며, 모든 공격 방향에서 안전한 엄폐를 보장하지는 않습니다.
비헤이비어 트리에서 쿼리 실행하기
BT_EnemyAI를 열고, 셀렉터나 시퀀스 아래에 Run EQS Query 태스크를 추가합니다. 디테일 패널에서 Query Template에 EQS_FindCover를, Blackboard Key에 블랙보드에 미리 만들어 둔 Vector 타입 키 BestCoverLocation을 지정합니다. Run Mode는 가장 높은 점수를 받은 항목 하나만 돌려주는 Single Best Item으로 둡니다.
같은 시퀀스에서 Run EQS Query 다음에 Move To 태스크를 놓고, 그 Blackboard Key를 BestCoverLocation으로 설정하면 AI가 찾아낸 엄폐 위치로 이동합니다. 쿼리가 성공했을 때만 결과 위치를 쓴다는 점이 중요합니다. 후보가 모두 걸러지면 Run EQS Query가 실패하므로, 시퀀스 규칙에 따라 다음 Move To는 실행되지 않습니다. 이때는 셀렉터의 다른 가지에서 잠시 기다리거나 목표를 다시 고르는 행동으로 돌아가게 만들어 둡니다.
후보가 걸러지고 선택되는 과정
쿼리가 실제로 어떻게 하나의 위치를 고르는지, 후보 네 개로 단순화한 예로 따라가 보겠습니다.
가장 먼 후보도 필터를 통과해야 선택할 수 있습니다
A/B/C/D에서 경로 없는 B·노출 C 탈락→A/D 점수 비교→D 위치 기록의 후보 집합 변화이다. 필터 순서는 설명 순서로 명시하며 엔진 내부 순서 보장으로 쓰지 않는다.
CANDIDATES · FILTER · SCORE · SELECT
가장 먼 후보도 필터를 통과해야 선택할 수 있습니다
네 후보의 거리와 필터 결과를 단순화한 예입니다. 경로 존재·시야 차폐로 걸러낸 뒤, 남은 후보를 기본 정규화 범위와 거리 Linear·양수 가중치로 점수화합니다.
| 후보 | AI 경로 | 플레이어 시야 | 플레이어와 거리 | 결과 |
|---|---|---|---|---|
| A | 있음 | 가려짐 | 300 cm | 점수화 대상 |
| B | 없음 | 가려짐 | 900 cm | 경로 필터 탈락 |
| C | 있음 | 보임 | 1,200 cm | 차폐 필터 탈락 |
| D | 있음 | 가려짐 | 600 cm | A보다 먼 유효 후보 · 선택 |
A
AI 경로: 있음
플레이어 시야: 가려짐
플레이어와 거리: 300 cm
결과: 점수화 대상
B
AI 경로: 없음
플레이어 시야: 가려짐
플레이어와 거리: 900 cm
결과: 경로 필터 탈락
C
AI 경로: 있음
플레이어 시야: 보임
플레이어와 거리: 1,200 cm
결과: 차폐 필터 탈락
D
AI 경로: 있음
플레이어 시야: 가려짐
플레이어와 거리: 600 cm
결과: A보다 먼 유효 후보 · 선택
선택 · 후보 D
B와 C는 거리와 관계없이 필터에서 탈락합니다. 남은 A·D 중 더 먼 D를 Single Best Item으로 선택하고 BestCoverLocation에 기록합니다.
결과 없는 경우도 분리합니다
후보가 모두 탈락하면 Run EQS Query가 실패합니다. 같은 Sequence의 다음 Move To를 실행하지 않고 대기·목표 재선택으로 복구합니다.
그리드 후보와 설정 안에서 고른 위치입니다. 모든 공격 방향의 안전이나 실제 이동 성공을 보장하는 결과는 아닙니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
| 범위 | 원문 |
|---|---|
| 도표 제목 | 필터를 통과한 후보만 점수 비교 |
| 관계·조건 설명 | A·B·C·D 네 후보에서 경로가 없는 B와 시야에 노출된 C가 필터에서 탈락한다. 남은 A·D만 거리 점수로 비교하여 D를 선택한다. 두 필터의 순서는 설명 순서이며 엔진 내부의 고정 처리 순서를 단정하지 않는다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 후보 네 개 설명용 A/B/C/D 엄폐점을 준비한다. |
|
|
| 필터 탈락 경로 없는 B와 노출된 C를 제거한다. |
|
|
| 점수와 기록 남은 A/D를 비교해 D를 기록한다. |
|
|
가장 먼 후보도 필터를 통과해야 선택할 수 있습니다
A/B/C/D에서 경로 없는 B·노출 C 탈락→A/D 점수 비교→D 위치 기록의 후보 집합 변화이다. 필터 순서는 설명 순서로 명시하며 엔진 내부 순서 보장으로 쓰지 않는다.
CANDIDATES · FILTER · SCORE · SELECT
가장 먼 후보도 필터를 통과해야 선택할 수 있습니다
네 후보의 거리와 필터 결과를 단순화한 예입니다. 경로 존재·시야 차폐로 걸러낸 뒤, 남은 후보를 기본 정규화 범위와 거리 Linear·양수 가중치로 점수화합니다.
| 후보 | AI 경로 | 플레이어 시야 | 플레이어와 거리 | 결과 |
|---|---|---|---|---|
| A | 있음 | 가려짐 | 300 cm | 점수화 대상 |
| B | 없음 | 가려짐 | 900 cm | 경로 필터 탈락 |
| C | 있음 | 보임 | 1,200 cm | 차폐 필터 탈락 |
| D | 있음 | 가려짐 | 600 cm | A보다 먼 유효 후보 · 선택 |
A
AI 경로: 있음
플레이어 시야: 가려짐
플레이어와 거리: 300 cm
결과: 점수화 대상
B
AI 경로: 없음
플레이어 시야: 가려짐
플레이어와 거리: 900 cm
결과: 경로 필터 탈락
C
AI 경로: 있음
플레이어 시야: 보임
플레이어와 거리: 1,200 cm
결과: 차폐 필터 탈락
D
AI 경로: 있음
플레이어 시야: 가려짐
플레이어와 거리: 600 cm
결과: A보다 먼 유효 후보 · 선택
선택 · 후보 D
B와 C는 거리와 관계없이 필터에서 탈락합니다. 남은 A·D 중 더 먼 D를 Single Best Item으로 선택하고 BestCoverLocation에 기록합니다.
결과 없는 경우도 분리합니다
후보가 모두 탈락하면 Run EQS Query가 실패합니다. 같은 Sequence의 다음 Move To를 실행하지 않고 대기·목표 재선택으로 복구합니다.
그리드 후보와 설정 안에서 고른 위치입니다. 모든 공격 방향의 안전이나 실제 이동 성공을 보장하는 결과는 아닙니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
| 범위 | 원문 |
|---|---|
| 도표 제목 | 필터를 통과한 후보만 점수 비교 |
| 관계·조건 설명 | A·B·C·D 네 후보에서 경로가 없는 B와 시야에 노출된 C가 필터에서 탈락한다. 남은 A·D만 거리 점수로 비교하여 D를 선택한다. 두 필터의 순서는 설명 순서이며 엔진 내부의 고정 처리 순서를 단정하지 않는다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 후보 네 개 설명용 A/B/C/D 엄폐점을 준비한다. |
|
|
| 필터 탈락 경로 없는 B와 노출된 C를 제거한다. |
|
|
| 점수와 기록 남은 A/D를 비교해 D를 기록한다. |
|
|
위 그림은 엄폐 후보 A, B, C, D가 두 필터와 거리 점수를 거쳐 하나로 좁혀지는 과정을 보여 줍니다. 표에 정리된 대로 A는 AI에서 경로가 있고 플레이어의 시야에서 가려지며 플레이어와 300cm 떨어져 있습니다. B는 900cm로 멀지만 경로가 없고, C는 1,200cm로 가장 멀지만 플레이어에게 보입니다. D는 경로가 있고 가려지며 600cm 떨어져 있습니다.
경로 필터에서 B가 빠져 A, C, D가 남고, 차폐 필터에서 C가 빠져 A와 D가 남습니다. B와 C는 거리와 관계없이 필터에서 탈락한다는 점을 눈여겨봅니다. 남은 A와 D를 거리 Linear와 양수 가중치로 점수화하면 600cm인 D가 300cm인 A보다 높은 점수를 받으므로, Single Best Item은 D를 고르고 그 위치를 BestCoverLocation에 기록합니다. 그림의 설명처럼 두 필터를 나열한 순서는 설명을 위한 것이며, 엔진 안에서 필터끼리 정해진 순서로 처리된다는 뜻은 아닙니다.
단계 그림은 같은 과정을 세 단계로 나눕니다. 첫 단계에서 설명용 엄폐점 A, B, C, D를 준비하고, 둘째 단계에서 경로가 없는 B와 노출된 C를 제거하며, 셋째 단계에서 남은 A와 D를 비교해 D를 기록합니다. 그림 아래쪽은 결과가 없는 경우도 따로 다뤄야 한다고 강조합니다. 후보가 모두 탈락하면 Run EQS Query가 실패하고 같은 시퀀스의 Move To는 실행되지 않으므로, 기다리거나 목표를 다시 고르는 행동으로 복구합니다. 또 이 결과는 격자 후보와 이 설정 안에서 고른 위치일 뿐, 모든 공격 방향에서의 안전이나 이동의 성공까지 보장하는 결과는 아닙니다.
더 깊이: 점수는 어떻게 정규화되고 곱해지나
앞의 예에서 D가 A보다 높은 점수를 받는다는 것은 알 수 있지만, 정확히 몇 점인지는 테스트의 점수 설정에 달려 있습니다. EQS 테스트 레퍼런스에 따르면 Distance나 Dot 같은 테스트는 측정한 원래 값을 먼저 정규화(normalization)하고, 그 값에 Scoring Equation의 곡선(Constant, Linear, Square, Inverse Linear, Square Root)을 적용한 뒤, 마지막으로 가중치인 Scoring Factor를 곱합니다. 정규화할 범위의 양 끝은 Clamp Min Type과 Clamp Max Type으로 정하며, 직접 지정한 값을 쓰거나 후보들에서 실제로 측정된 가장 작은 값과 가장 큰 값을 씁니다. 그리고 Normalization Type이 Absolute이면 범위의 시작을 0으로, Relative to Scores이면 후보 가운데 가장 낮은 값으로 잡습니다.
이 규칙으로 앞의 예를 다시 계산해 봅니다. 측정된 최댓값을 범위의 끝으로 쓰고 Absolute로 정규화하면, 600cm인 D는 600 ÷ 600 = 1.0이고 300cm인 A는 300 ÷ 600 = 0.5입니다. 같은 조건에서 Relative to Scores로 바꾸면 범위가 300에서 600이 되어 A는 0, D는 1.0이 됩니다. 두 경우 모두 D가 선택되지만 점수의 차이는 달라지므로, EQS Testing Pawn에 표시되는 숫자를 읽을 때는 이 설정을 함께 확인합니다. Scoring Factor는 음수로도 정할 수 있어서, 곡선을 바꾸지 않고 가중치의 부호만으로 점수의 방향을 뒤집을 수도 있습니다.
EQS를 쓸 때 주의할 점
EQS는 실행 중에 계산을 하므로 성능에 신경 써야 합니다. 후보를 너무 많이 만들거나 무거운 테스트를 많이 붙이면 쿼리 한 번의 비용이 커지고, 여러 AI가 자주 실행하면 그 비용이 그대로 쌓입니다. 후보의 간격과 범위는 필요한 만큼만 잡고, 걸러 내는 테스트로 점수를 매길 후보를 먼저 줄입니다.
쿼리가 예상과 다른 위치를 고르면 EQS Testing Pawn으로 레벨 안에서 후보와 점수를 직접 확인합니다. 어떤 후보가 어느 테스트에서 걸러졌는지를 보면, 대부분은 기준이 되는 컨텍스트를 잘못 설정한 경우라는 것을 알게 됩니다. AI의 위치, 목표의 위치, 특정 지점 가운데 무엇을 기준으로 하는지가 쿼리의 결과를 좌우하므로 컨텍스트부터 확인합니다.
게임에 맞는 특별한 로직이 필요하면 EQS를 확장할 수 있습니다. 제너레이터와 컨텍스트는 블루프린트로 만들 수 있지만, 공식 문서에 따르면 사용자 정의 테스트는 C++로만 만들 수 있습니다.
EQS를 비헤이비어 트리와 함께 쓰면, AI가 정해진 길만 따라가는 데서 벗어나 상황에 따라 위치를 고르는 움직임을 보여 줄 수 있습니다.
정리
- EQS는 후보를 만들고 걸러 내고 점수를 매겨, AI가 행동할 위치나 대상을 실행 중에 고르는 시스템입니다.
- 제너레이터는 후보를 만들고, 컨텍스트는 기준 위치나 대상을 주며, 테스트는 후보를 걸러 내거나 점수를 매깁니다. 블랙보드 키 이름만으로 컨텍스트가 생기지는 않습니다.
- 걸러 내는 테스트를 통과하지 못한 후보는 거리가 아무리 좋아도 선택될 수 없습니다.
Run EQS Query는 결과를 블랙보드 키에 저장하고, 후보가 모두 탈락하면 실패하므로 같은 시퀀스의 다음 태스크가 실행되지 않습니다.- 사용자 정의 제너레이터와 컨텍스트는 블루프린트로, 사용자 정의 테스트는 C++로 만듭니다.
연습 문제
1. 필터 조건 하나가 바뀐 후보 선택
그림의 A, B, C, D 가운데 D의 시야 차폐만 사라졌습니다. 경로와 거리, 나머지 후보의 조건, 거리 Linear와 양수 가중치의 점수 기준은 그대로입니다. 어느 후보가 선택될까요? 이어서 A의 경로도 없어졌다면 같은 시퀀스의 Move To를 실행할 수 있을까요?
해설 보기
먼저 B는 경로가 없어서, C와 D는 시야에 노출되어서 탈락합니다. 경로가 있고 가려진 후보는 A 하나만 남으므로 A가 선택됩니다.
A의 경로까지 없어지면 남는 후보가 없어 쿼리가 실패하고, 같은 시퀀스의 다음 Move To는 실행되지 않습니다. 이때 가장 먼 C를 되살려 고르는 것은 필터 조건을 어기는 일입니다. 또 300cm라는 거리 자체를 최종 점수로 읽지 않습니다. 점수는 정규화되며, 다른 점수 테스트가 있다면 그 테스트와 합쳐진 값이므로 실제 점수의 의미를 함께 확인합니다.
2. 가까운 엄폐를 원할 때
기획이 바뀌어, 시야가 가려진 후보 가운데 AI가 플레이어에게 가까이 붙어 있을 수 있는 엄폐를 고르게 하려고 합니다. 그림의 원래 조건에서 Distance 테스트를 어떻게 바꾸면 되고, 그때 A와 D 중 무엇이 선택될까요?
해설 보기
Distance 테스트의 Scoring Equation을 Inverse Linear로 바꾸고 Scoring Factor는 양수로 둡니다. 그러면 플레이어에게 가까운 후보일수록 높은 점수를 받습니다.
필터는 그대로이므로 남는 후보는 여전히 A와 D이고, 그중 플레이어와 더 가까운 300cm의 A가 선택됩니다. 점수의 방향을 바꿔도 필터에서 이미 탈락한 B와 C는 다시 후보가 되지 않습니다.
3. 격자 간격과 후보 수
이 글의 Points: Grid는 Grid Half Size 1000, Space Between 200입니다. 후보를 더 촘촘히 보겠다고 Space Between을 100으로 줄이면 후보 수는 대략 몇 배가 될까요? 이 변경을 할 때 무엇을 함께 생각해야 할까요?
해설 보기
한 변이 -1000에서 1000까지이므로, 간격이 200이면 한 변에 11개, 격자 전체로 11 × 11 = 121개의 후보가 투영 전에 만들어진다고 계산할 수 있습니다. 간격을 100으로 줄이면 한 변에 21개, 전체 21 × 21 = 441개가 되어 약 3.6배로 늘어납니다. 간격을 절반으로 줄이면 한 변의 개수가 약 두 배가 되므로, 2차원 격자의 후보 수는 약 네 배에 가깝게 늘어납니다.
후보가 늘면 Pathfinding과 Trace처럼 후보마다 실행되는 테스트의 비용도 그만큼 늘어나고, 이 쿼리를 여러 AI가 자주 실행하면 비용이 쌓입니다. 그래서 간격을 줄이기 전에 지금 간격에서 실제로 좋은 엄폐 지점을 놓치고 있는지 EQS Testing Pawn으로 먼저 확인하고, 필요하다면 범위를 줄이거나 쿼리를 실행하는 빈도를 함께 조정합니다.
EQS의 구성 요소와 필터, 점수 테스트의 동작은 언리얼 엔진 공식 문서의 EQS 개요에서 확인할 수 있습니다.
다음 글 내비게이션 시스템을 통한 기본 AI 이동에서는 이 글의 Move To가 실제로 동작하도록 NavMesh Bounds Volume을 설정하고, AI Move To로 목표까지 경로를 찾아 이동하며 이동이 실패하는 원인을 찾는 방법을 다룹니다.