icon
8장 : AI 시스템 구축

EQS의 기본 활용법


지난 절에서 우리는 AI의 두뇌 역할을 하는 비헤이비어 트리와 AI가 사용하는 데이터 저장소인 블랙보드에 대해 알아보았습니다. 비헤이비어 트리가 "무엇을 할 것인가?"를 결정한다면, 이제 "어디서, 어떻게 할 것인가?"에 대한 질문에 답할 차례입니다. 이를 위해 언리얼 엔진은 환경 쿼리 시스템(Environment Query System, EQS) 이라는 강력한 도구를 제공합니다.

이번 절에서는 EQS의 기본 개념과 AI가 게임 환경을 '인지'하고 '선택'하는 데 어떻게 활용되는지 알아보겠습니다.


EQS란 무엇인가?

EQS (Environment Query System) 는 AI가 주변 환경을 분석하고, 특정 기준에 따라 최적의 위치나 대상(Item) 을 찾아낼 수 있도록 돕는 시스템입니다. 복잡한 환경에서 AI가 지능적인 의사결정을 내릴 수 있도록 지원하는 '눈'이자 '탐색 도구'라고 생각할 수 있습니다.

EQS가 필요한 이유

  • 지능적인 의사결정: AI가 단순히 플레이어를 따라가는 것을 넘어, 엄폐할 위치, 아이템을 주울 위치, 공격하기 좋은 위치, 도주할 경로 등을 스스로 판단하게 합니다.
  • 복잡한 환경 분석: 게임 세계의 복잡한 지형, 오브젝트, 다른 AI 등을 고려하여 의미 있는 위치를 찾아냅니다.
  • 다양한 조건 적용: 거리, 시야, 엄폐 여부, 주변 위험도, 특정 태그 유무 등 여러 가지 조건을 동시에 고려하여 최적의 대상을 필터링하고 점수를 매길 수 있습니다.
  • 재사용성: 한 번 만든 쿼리는 다양한 AI 캐릭터에 재사용될 수 있습니다.

EQS의 핵심 구성 요소

EQS는 크게 다음과 같은 요소들로 구성됩니다.

환경 쿼리 에셋 (Environment Query Asset)

  • Environment Query 에셋을 생성하고 EQS 에디터에서 쿼리 자체를 설계합니다. 여기에는 제너레이터(Generator), 컨텍스트(Context), 테스터(Tester) 등이 포함됩니다.
  • 생성 방법: 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 인공지능(Artificial Intelligence) > 환경 쿼리(Environment Query) 선택 후 이름을 지정합니다 (예: EQS_FindCover).

제너레이터 (Generators)

  • 쿼리를 실행할 때, 환경에서 어떤 '항목(Item)'들을 생성할지 결정합니다. 이 항목들이 나중에 점수 매기기 및 필터링의 대상이 됩니다.
  • 예시
    • Generate Points in Radius: 특정 위치 주변에 일정 수의 점을 생성합니다. (예: AI 주변 10미터 반경에 50개의 잠재적 엄폐 위치 생성)
    • Generate Actors of Class: 특정 클래스의 모든 액터를 항목으로 생성합니다. (예: 모든 BP_HealthPotion 액터를 항목으로 생성)
    • Generate Points around Item: 특정 아이템(컨텍스트) 주변에 점을 생성합니다.

컨텍스트 (Contexts)

  • 제너레이터가 점을 생성하거나, 테스터가 조건을 검사할 때 필요한 '기준점'이나 '참조 대상' 을 제공합니다.
  • 예시
    • Current Location: 쿼리를 실행하는 AI 자신의 현재 위치.
    • Target Actor: 블랙보드에 저장된 AI의 현재 목표 액터 (예: 플레이어).
    • Querier: 쿼리를 실행하는 AI 컨트롤러.
  • 사용자 정의 컨텍스트를 만들어 특정 액터나 컴포넌트를 기준으로 삼을 수도 있습니다.

테스터 (Testers)

  • 제너레이터가 생성한 각 항목(Item)에 대해 다양한 조건을 테스트하고 점수를 매기는 역할을 합니다. 각 테스터는 특정 기준에 따라 항목을 '필터링(Filter)'하거나 '점수(Score)'를 부여합니다.
  • 예시
    • Distance: 항목과 특정 컨텍스트(예: 플레이어) 간의 거리를 테스트합니다. (멀수록 좋은 엄폐 위치)
    • Pathfinding Cost: 항목까지의 이동 경로 비용을 테스트합니다. (경로가 너무 복잡하면 점수 삭감)
    • Line Of Sight: 항목에서 특정 컨텍스트(예: 플레이어)까지 시야가 확보되는지 테스트합니다.
    • Has Trace Target: 항목에서 특정 컨텍스트까지의 경로에 엄폐물이 있는지 테스트합니다. (엄폐물 유무)
    • Dot Product: 항목에서 특정 방향으로의 벡터와 다른 벡터 간의 내적을 테스트합니다. (특정 방향으로의 엄폐)

블랙보드 (Blackboard)

  • EQS가 찾아낸 최적의 위치나 대상을 블랙보드 키에 저장합니다. 이후 비헤이비어 트리에서 이 블랙보드 키의 값을 사용하여 AI의 행동을 지시합니다. (예: BestCoverLocation 키에 EQS 결과 저장)

EQS 기본 활용법: 엄폐 위치 찾기 예시

플레이어에게 공격받을 때 AI가 엄폐할 위치를 찾는 EQS를 만들어봅시다.

목표: AI 주변에서 플레이어에게서 멀고, 플레이어의 시야를 가려주는 엄폐물 뒤의 위치를 찾습니다.

EQS 에셋 생성

  • 콘텐츠 브라우저에서 EQS_FindCover라는 이름으로 Environment Query 에셋을 생성합니다.
  • 에셋을 더블클릭하여 EQS 에디터를 엽니다.

컨텍스트 추가

  • 컨텍스트(Contexts) 패널에서 쿼리 실행자(Querier)를 마우스 우클릭하여 새 컨텍스트 추가(Add New Context)를 선택합니다.
  • BP_PlayerCharacter_Context와 같은 사용자 정의 컨텍스트를 생성합니다. (아니면 단순화하여 TargetActor 컨텍스트를 사용해도 됩니다.)
  • BP_PlayerCharacter_Context 블루프린트 에디터를 열고, Provide Actors 함수를 오버라이드하여 Get Player Character 노드를 연결하고 Actors 출력 핀에 연결합니다.
  • 이제 EQS 에디터의 컨텍스트 패널에서 이 BP_PlayerCharacter_Context를 추가합니다.

제너레이터 추가

  • EQS 에디터의 루트 노드에서 + 버튼을 클릭하고 제너레이터(Generators) > Generate Points in Radius를 선택합니다.
  • 디테일 패널
    • Query Context: Querier (EQS를 실행하는 AI의 위치를 기준으로 점을 생성합니다.)
    • Generate Around: Querier
    • Radius: 1000.0 (AI 주변 10미터 반경)
    • Number Of Points: 50 (50개의 잠재적 엄폐 위치 후보 생성)
  • 에디터 뷰포트에서 초록색 점들이 생성되는 것을 확인할 수 있습니다.

테스터 추가 (필터링 및 점수 매기기)

  • Generate Points in Radius 노드에서 + 버튼을 클릭하고 테스터(Testers) > Distance를 선택합니다.
  • 디테일 패널
    • Distance To: BP_PlayerCharacter_Context (플레이어와 각 점 사이의 거리)
    • Test Mode: Score (점수)
    • Scoring Equation: Inverse (플레이어에게서 멀수록 높은 점수)
  • Distance 테스터에서 + 버튼을 클릭하고 테스터 > Has Trace Target을 선택합니다.
  • 디테일 패널
    • Target Context: BP_PlayerCharacter_Context
    • Trace Channel: Visibility (가시성 채널)
    • Trace Start: Target Context (플레이어 위치)
    • Trace End: Item (각 잠재적 엄폐 위치)
    • Filter Type: Block (플레이어와 해당 점 사이에 시야를 막는 무언가가 있는지)
    • Scoring Mode: Filter (이 조건에 맞지 않으면 해당 항목을 제거)
    • Show Debug Traces: 체크 (디버그 라인 표시)
  • Has Trace Target 테스터에서 + 버튼을 클릭하고 테스터 > Line Of Sight를 선택합니다.
  • 디테일 패널
    • Target Context: BP_PlayerCharacter_Context
    • Test Mode: Score
    • Scoring Equation: Inverse (시야가 안 보일수록 높은 점수)
  • 이제 EQS 에디터의 디버그(Debug) 뷰포트에서 Simulate 버튼을 누르거나, 에디터 레벨에 AI를 배치하고 플레이하면 EQS가 계산한 점수와 필터링 결과를 시각적으로 확인할 수 있습니다. 가장 높은 점수를 받은 위치가 흰색으로 강조됩니다.

비헤이비어 트리에서 EQS 실행

  • BT_EnemyAI 비헤이비어 트리를 엽니다.
  • Selector 또는 Sequence 노드 뒤에 Run EQS 태스크 노드를 추가합니다.
  • 디테일 패널
    • Query Template: EQS_FindCover (생성한 EQS 에셋)
    • Blackboard Key: BestCoverLocation (블랙보드에 미리 생성한 Vector 타입 키)
    • Run Mode: Single Best Item (가장 높은 점수를 받은 하나의 항목만 반환)
  • Run EQS 태스크가 성공하면 Blackboard Key에 최적의 엄폐 위치가 저장됩니다.
  • 이후 Move To 태스크 노드를 추가하고 Blackboard KeyBestCoverLocation으로 설정하면, AI가 찾아낸 엄폐 위치로 이동하게 됩니다.

EQS 활용 시 고려사항

  • 성능: EQS는 런타임에 계산을 수행하므로, 너무 많은 항목을 생성하거나 너무 복잡한 테스터를 사용하면 성능에 영향을 미칠 수 있습니다. 필요한 만큼만 최소한의 제너레이터와 테스터를 사용하도록 최적화해야 합니다.
  • 디버깅: EQS 에디터의 시뮬레이션 기능과 디버그 옵션은 쿼리가 어떻게 작동하는지 이해하고 문제를 해결하는 데 매우 중요합니다.
  • 컨텍스트의 중요성: AI의 위치, 목표의 위치, 특정 지점 등 쿼리의 기준이 되는 컨텍스트를 정확하게 설정하는 것이 중요합니다.
  • 커스텀 테스터/제너레이터: 복잡하거나 특정 게임에 특화된 로직이 필요할 경우, C++ 또는 블루프린트로 커스텀 테스터나 제너레이터를 만들 수 있습니다.

EQS는 AI가 게임 환경을 능동적으로 분석하고, 단순히 정해진 길을 가는 것을 넘어 전략적이고 지능적인 움직임을 보여주게 만드는 핵심 도구입니다. 복잡한 AI 행동을 구현할 때 비헤이비어 트리와 함께 EQS를 적절히 활용하는 것이 중요합니다.


이번 절에서는 환경 쿼리 시스템(EQS)의 기본 개념, 주요 구성 요소, 그리고 엄폐 위치 찾기 예시를 통해 EQS가 AI의 지능적인 환경 분석과 의사결정에 어떻게 기여하는지 알아보았습니다. EQS는 AI의 행동에 깊이와 현실감을 더하는 데 필수적인 도구입니다.