본문 바로가기

환경 쿼리와 트레이싱 기본 활용

라인·박스·구·캡슐 트레이스로 시야·명중·상호작용 대상을 탐색하고 쿼리 결과를 디버깅합니다.

지난 절에서 On Hit, On Overlap 기반 상호작용을 익혔다면, 이제 충돌 이전 단계의 탐색으로 확장할 차례입니다.

실제 게임플레이에서는 오브젝트가 부딪히기 전에도 주변 상황을 알아야 합니다.

특정 영역에 무엇이 있는지, 전방 경로가 막혀 있는지 같은 정보를 미리 얻기 위해 쿼리(Query)와 트레이스(Trace)를 사용합니다.

이번 절에서는 환경 정보를 얻기 위한 환경 쿼리와 트레이싱(Tracing)의 기본 활용 흐름을 정리합니다.


환경 쿼리와 트레이싱이란 무엇인가?

환경 쿼리(Environment Query)는 특정 조건에 맞는 환경 정보를 질의하는 포괄적인 개념입니다.

8장에서 다룬 EQS (Environment Query System)는 후보를 생성하고 필터링·평가하는 시스템입니다. 여기서는 그와 구분하여 기본적인 충돌 쿼리인 Trace를 다룹니다.

트레이싱(Tracing)은 가상의 선(Line) 또는 형태(Shape)를 월드에 발사해 특정 콜리전(Collision) 오브젝트와 교차하는지 확인하는 메커니즘입니다.

물리 시뮬레이션 결과와 분리해 콜리전 메시 기준으로 빠르게 판정할 수 있기 때문에, 환경 정보를 정확하게 수집하는 데 매우 유용합니다.

환경 쿼리와 트레이싱이 필요한 이유
  • 시야/가시성 검사: AI가 플레이어를 볼 수 있는지, 플레이어가 엄폐물 뒤에 있는지 확인합니다.
  • 장애물 검사: 선분이나 이동 형상을 가로막는 충돌이 있는지 확인합니다. NavMesh 경로의 도달 가능성은 별도의 경로 찾기 검사로 판단합니다.
  • 공격/능력 범위 판정: 총알이나 스킬이 적에게 명중했는지, 범위 내에 적이 있는지 판정합니다.
  • 상호작용 감지: 플레이어의 시선 앞에 상호작용 가능한 오브젝트(문, 스위치, 아이템)가 있는지 감지합니다.
  • 배치 검사: 오브젝트를 배치할 때 다른 오브젝트와 겹치지 않는지 확인합니다.

AI가 위치를 선택하는 문제에서는 EQS와 Trace를 함께 쓰는 방식이 특히 유용합니다.

EQS에서 후보 위치의 시야·충돌 조건을 검사할 때 Trace를 활용할 수 있습니다. 후보까지 걸어서 갈 수 있는지는 Pathfinding 테스트 등과 구분합니다.


트레이싱의 종류와 활용

트레이싱은 발사하는 가상의 형태에 따라 여러 종류가 있습니다.

가장 흔하게 사용되는 트레이싱은 다음과 같습니다.

라인 트레이스 (Line Trace)

가장 기본적인 트레이싱으로, 한 지점에서 다른 지점까지 직선을 발사합니다.

  • 블루프린트 노드
    • Line Trace By Channel: 특정 콜리전 채널을 사용하여 트레이스합니다.
    • Line Trace For Objects: 지정한 충돌 Object Type만 대상으로 합니다. Blueprint 클래스 필터가 필요하면 반환된 Actor를 별도로 검사합니다.
  • 주요 입력 핀
    • Start: 트레이스를 시작할 월드 위치 (Vector)
    • End: 트레이스가 끝날 월드 위치 (Vector)
    • Trace Channel / Object Types: 어떤 콜리전 채널/오브젝트 타입을 검사할지 지정합니다.
    • Actors to Ignore: 트레이스에서 무시할 액터 배열 (예: 트레이스 발사 액터 자신)
    • Draw Debug Type: 디버그 라인을 그릴지 여부 (None, For One Frame, For Duration)
  • 주요 출력 핀 (Out Hit 구조체)
    • Blocking Hit: 트레이스가 무엇인가에 의해 막혔는지 (Bool)
    • Hit Actor: 충돌한 액터 (Actor Reference)
    • Hit Component: 충돌한 컴포넌트 (Primitive Component Reference)
    • Location: 충돌 시점의 트레이스 형상 위치입니다. Shape Trace에서는 형상의 중심 위치와 관계됩니다.
    • Normal: 스윕 형상 쪽 충돌 법선입니다.
    • Distance: 시작점부터 충돌 위치까지의 거리입니다.
    • Impact Point / Impact Normal: 실제 표면의 접촉점과 법선입니다. 라인에서는 Location/Normal과 일치하지만 Shape Trace에서는 다를 수 있습니다.
활용 예시
  • 총알 명중 판정
    • Start는 총구 위치, End는 총구 위치 + 총구 방향 * 최대 사거리로 설정.
    • Trace Channel은 Visibility (가시성) 또는 커스텀 Projectile 채널.
    • Hit Actor가 플레이어/적일 경우 데미지 적용. Hit Location에 총알 박히는 이펙트 생성.
    • 블루프린트 로직: 아래는 노드 연결의 의사 코드입니다. Hit Location/Normal은 Break Hit Result에서 읽은 위치·법선을 뜻하고, 실제 Apply Damage의 대상 입력은 Damaged Actor입니다. 멀티플레이의 최종 피해는 서버가 검증한 경로에서 적용합니다.
      (Shoot Event)
      -> Line Trace By Channel (Start: GetMuzzleLocation, End: MuzzleLocation + ForwardVector * 5000, Trace Channel: Visibility)
      -> Branch (Out Hit -> Blocking Hit)
          -> True:
              -> Break Hit Result (Get Hit Actor, Get Hit Location, Get Hit Normal)
              -> Spawn Emitter At Location (Location: Hit Location, Rotation: Make Rot From Z(Hit Normal))
              -> Apply Damage (Target: Hit Actor, Damage Amount: 20)
  • AI 시야 검사
    • Start는 AI의 눈 위치, End는 플레이어 캐릭터의 위치.
    • Trace Channel은 Visibility.
    • Actors to Ignore에 AI 자신을 추가.
    • Blocking Hit가 True이고 Hit Actor가 플레이어가 아니라면 (즉, 중간에 장애물이 있다면) 플레이어를 볼 수 없음.

Box/Sphere/Capsule Trace

선형 트레이스 대신 특정 형태를 월드에 발사하여 콜리전을 감지합니다.

특정 범위 내의 오브젝트를 찾거나, 더 넓은 영역의 충돌을 검사할 때 유용합니다.

  • 블루프린트 노드
    • Box Trace By Channel / Sphere Trace By Channel / Capsule Trace By Channel
  • 주요 입력 핀
    • Start: 트레이스 시작 위치
    • End: 트레이스 끝 위치
    • Half Size (Box) / Radius (Sphere) / Radius, Half Height (Capsule): 트레이스 형태의 크기
    • Orientation (Box): 박스 형상의 회전입니다. 기본 Blueprint Capsule Trace에는 이 회전 입력이 없습니다.
    • 나머지 핀은 라인 트레이스와 유사합니다.
  • 주요 출력 핀
    • 단일 Out Hit 또는 Multi 버전의 Out Hits입니다. Multi By Channel은 첫 Blocking Hit까지의 결과만 반환하며, Multi For Objects는 지정한 Object Type에 맞는 결과를 반환합니다.
활용 예시
  • 근접 공격 범위 판정
    • 캐릭터 전방에 Sphere Trace 또는 Box Trace를 짧게 발사.
    • Pawn들을 대상으로 하려면 Sphere Trace For Objects 등의 Object Types에 Pawn을 넣습니다. Pawn은 기본 Object Type이지 적만 의미하는 Trace Channel이 아닙니다.
    • Multi 결과에서 유효한 적을 판별하고 같은 Actor가 여러 컴포넌트로 검출되면 중복을 제거한 뒤 한 번씩 피해를 적용합니다.
  • 환경 배치 검사
    • 새 오브젝트를 배치하려는 위치에 Box Trace를 발사하여 기존 오브젝트와 겹치는지 확인.
    • 겹칠 경우 빨간색으로 표시하거나 배치 불가능 처리.

TRACE QUERY · LOCATION · IMPACT POINT

구 스윕의 중심 위치와 표면 접촉점은 다를 수 있습니다

정면의 평평한 벽에 초기 겹침 없이 도달하는 단순 개념도입니다. Trace는 충돌 결과를 조회하며, 표시된 구를 물리적으로 밀거나 튕기지 않습니다.

Line Trace · 선분

선 트레이스의 벽 접촉점선분이 벽 표면에서 막히면 Location과 Impact Point가 같은 접촉 위치다.벽Start접촉 위치
선 트레이스의 표면 접촉 위치초기 겹침 없는 정면의 평평한 벽이다. 선에서는 Location과ImpactPoint가 같은 표면이고 구에서는 반지름30cm만큼 중심이 앞선다. 조회는 물리 반응이 아니다.벽Start같은 접촉점

Location = Impact Point: 벽 표면의 접촉 위치입니다. 두 법선도 라인에서는 일치합니다.

Sphere Trace · 구 형상의 스윕

구 스윕의 중심과 표면 접촉점구 중심이 벽 앞 30cm에서 멈췄을 때 Location은 중심, Impact Point는 벽 표면이다. 초기 겹침 없는 정면 충돌의 단순 개념도다.벽Start중심접촉
구 스윕의 중심과 접촉 위치초기 겹침 없는 정면의 평평한 벽이다. 선에서는 Location과ImpactPoint가 같은 표면이고 구에서는 반지름30cm만큼 중심이 앞선다. 조회는 물리 반응이 아니다.벽Start중심접촉

Location: 충돌 시점의 구 중심 위치입니다.

Impact Point: 벽과 닿은 표면 접촉점입니다. 충돌 크기와 형상에 따라 중심과 다릅니다.

형상 위치 · 접촉점 · 경로 도달 가능성을 구분합니다

Blocking Hit 결과를 분기하고 Hit Actor/Component를 검증합니다. Shape Trace의 Normal과 Impact Normal도 역할이 다를 수 있습니다. 여기의 두 점 설명을 초기 겹침 등 모든 충돌 사례에 기계적으로 적용하지 않습니다.

Trace로 선분/형상의 막힘을 검사하는 것과 NavMesh로 걸어서 도달할 수 있는지 검사하는 것은 별도입니다. For One Frame은 디버그 표시 수명이며 매 프레임 조회를 자동 실행하지 않습니다.

예시 벽 좌표에서 라인과 구의 결과를 계산하기

월드 길이는 cm 기준으로 읽고, Start=(0,0,0), 단위 방향 (1,0,0), 거리 5,000 cm를 사용합니다. 따라서 End=(5000,0,0)이며 사거리는 50 m입니다. 위 총알 의사 코드의 5000은 방향 벡터가 정규화된 조건에서 이 거리가 됩니다. 첫 Blocking 벽이 평평한 x=1000 면이고, 시작 위치가 벽 안에 있지 않으며 다른 충돌은 없다고 가정합니다.

라인의 Location과 Impact Point는 이 조건에서 (1000,0,0)입니다. 같은 경로의 반지름 30 cm 구 스윕은 중심이 (970,0,0)일 때 벽에 처음 닿고, 표면 접촉점은 (1000,0,0)입니다. 구 중심에 이펙트를 놓을지 실제 접촉점에 놓을지에 따라 출력 핀이 달라집니다. 먼저 Blocking Hit를 분기하고 유효한 Hit Actor/Component를 확인한 뒤 결과를 사용합니다. 실패 경로에서는 기본 Hit 값을 실제 명중으로 읽어 피해나 접촉 효과를 만들지 않습니다.

직접 판단하기 시작점을 (100,0,0), 끝점을 (2100,0,0)으로 옮겼습니다. 첫 벽은 x=1500, 구 반지름은 50 cm입니다. 초기 겹침 없이 정면으로 이동하며 다른 충돌은 없습니다. 구 스윕의 중심 Location, Impact Point, 중심이 시작점에서 이동한 거리를 계산하세요. 라인 결과와도 비교해 보세요.

표면·반지름·시작점으로 계산

구 중심은 벽보다 반지름만큼 앞인 (1450,0,0), 접촉점은 (1500,0,0)입니다. 중심의 이동 거리는 1450 - 100 = 1350cm입니다. 라인은 (1500,0,0)에서 접촉하므로 이동 거리가 1500 - 100 = 1400cm입니다. 이 차이는 쿼리 형상의 반지름에 따른 것이며, 실제 구 액터가 이만큼 이동하거나 튕겼다는 물리 결과는 아닙니다. 비스듬한 표면·초기 겹침은 이 단순 좌표 조건과 구분합니다.

트레이싱 디버깅

Draw Debug Type 핀을 For Duration 또는 For One Frame으로 설정하여 트레이스 라인이나 형태를 시각적으로 확인하는 것이 디버깅의 핵심입니다.

  • For One Frame: 호출한 쿼리를 한 프레임 동안 표시합니다. 이 옵션이 쿼리 자체를 매 프레임 실행하지는 않습니다.
  • For Duration: 일정 시간 동안 트레이스를 그려서 지속적인 움직임에 따른 트레이스 변화를 확인합니다.

트레이싱 사용 시 고려사항

  • 콜리전 설정의 중요성: 트레이싱은 액터의 콜리전 설정(Object Type, Trace Responses)에 따라 결과가 달라집니다. 원하는 대로 작동하지 않는다면 액터의 콜리전 설정을 다시 확인해야 합니다.
  • 성능: 트레이싱은 비교적 저렴한 연산이지만, 너무 자주(예: 매 프레임, 많은 액터에서) 긴 거리를 트레이스하면 성능에 영향을 줄 수 있습니다. 필요한 경우에만 실행하고, 거리를 최소화하는 것이 좋습니다.
  • 조회와 반응: Trace는 충돌 결과를 조회하며, 오브젝트를 튕기는 물리 반응을 수행하지 않습니다. 비용은 형상·거리·횟수·충돌 복잡도에 따라 측정합니다.
  • 오너십 및 네트워크: 멀티플레이어 환경에서는 트레이스 로직을 주로 서버에서 실행하는 것이 안전합니다. 클라이언트에서 트레이스 결과에 따라 중요한 게임플레이 로직을 처리하면 클라이언트 조작의 여지가 생길 수 있습니다. (예: 총알 명중 판정은 반드시 서버에서!)

환경 쿼리와 트레이싱은 게임 세계의 정보를 얻고, AI의 의사결정, 플레이어의 상호작용, 전투 시스템 등 다양한 게임플레이 로직을 구현하는 데 필수적인 도구입니다.

콜리전 시스템과 함께 이들을 능숙하게 활용하는 것이 언리얼 엔진 개발의 핵심 역량 중 하나입니다.


이번 절에서는 라인 트레이스와 박스 트레이스처럼 환경 정보를 조회하는 트레이싱 기능의 기본 사용법과 디버깅 방법을 다뤘습니다.

트레이싱은 상호작용, 피격 판정, 시야 확인 같은 게임플레이 로직에서 자주 사용됩니다.