왜 EQS를 쓰게 됐는가
몬스터 AI를 만들다 보니 단순히 플레이어를 보고 달려가서 공격하는 구조만으론 너무 기계적으로 보였다.
공격 모션 자체는 들어가지만, 전투가 뻣뻣하고 리듬감이 전혀 없다. 우리가 흔히 알고 있는 RPG게임의 전투는 이렇지 않다.
공격을 피했다가, 옆으로 게걸음 치듯 돌고, 다시 타이밍을 잡아 공격하는… 그런 살아있는 움직임.
그래서 EQS(Environment Query System)를 쓰기로 했다.
EQS는 주변에 여러 후보 지점을 생성하고, 조건에 맞는 최적의 위치를 선택하게 한다.
즉, “이 상황에서 어디로 움직여야 전투가 자연스러워질까”를 AI 스스로 판단할 수 있는 구조.
사용방법
1. AI → Env Query 생성
그러면 아래와 같은 기능을 확인 할 수있다.
- Circle, Grid, Cone 등등
나는 플레이어 주변을 원형으로 돌도록 만들고 싶어서 Circle을 선택했다.
2. Add Test → 조건 설정
- 예: Distance(거리)를 조건으로 추가
3. EQS Test Pawn 생성
- 시각적으로 어떻게 동작하는지 확인하기 위함
그런 다음에 해당 BP에 아까 만들어 놓은 EQS를 세팅한다.
4. EnvQueryContext_BlueprintBase 생성
- Query의 기준점을 정의하기 위해 필요
- BP에서 GetActorOfClass 노드 사용 → Player Start 액터를 리턴하도록 세팅
Query에 대상을 Player Start 액터로 지정한다는 의미이다. (스샷에는 없지만 실행 링크까지 연결 해야함)
5. Circle Center에 Env Query 세팅
- 이렇게 하면 플레이어를 기준으로 Circle 포인트가 생성된다.
결과 확인
- 원형 구 위의 숫자는 점수다.
- 이 점수를 기준으로 액터가 어떤 위치로 이동할지 결정할 수 있다.
- Behavior Tree에서 Run EQS Query를 실행하고, Run Mode를 조정해서 이 점수를 활용한다.
-
더보기
Run Mode
- Single Result
- 가장 점수가 높은 하나의 위치만 반환
- Random Best 5% (또는 Best X%)
- 상위 몇 % 점수 안에 드는 위치들 중 하나를 랜덤으로 선택
- All Matching
- 조건을 만족하는 모든 포인트를 반환
- Single Result
정리
EQS를 적용하면서 단순히 “몬스터가 플레이어를 쫓는다”에서 끝나는 AI가 아니라,
조건에 따라 포지션을 스스로 판단하고, 더 자연스러운 전투 움직임을 보여줄 수 있었다.
이 과정을 통해 배운 건 단순히 언리얼 기능 사용법이 아니라,
- 전투 AI에서 문제(뻣뻣한 움직임)를 인식하고
- 적절한 툴(EQS)을 찾아 적용하며
- 테스트와 반복을 통해 결과를 개선했다는 점이다.