환경 쿼리와 트레이싱 기본 활용
라인·박스·구·캡슐 트레이스로 시야·명중·상호작용 대상을 탐색하고 쿼리 결과를 디버깅합니다.
지난 절에서 On Hit, On Overlap 기반 상호작용을 익혔다면, 이제 충돌 이전 단계의 탐색으로 확장할 차례입니다.
실제 게임플레이에서는 오브젝트가 부딪히기 전에도 주변 상황을 알아야 합니다.
특정 영역에 무엇이 있는지, 전방 경로가 막혀 있는지 같은 정보를 미리 얻기 위해 쿼리(Query)와 트레이스(Trace)를 사용합니다.
이번 절에서는 환경 정보를 얻기 위한 환경 쿼리와 트레이싱(Tracing)의 기본 활용 흐름을 정리합니다.
라인, 박스, 스피어 같은 가상 형태를 쏴서 시야, 명중, 상호작용, 배치 가능성을 판단한다.
- 질문 정의
Start, End, Trace Channel, Object Types로 무엇을 검사할지 정한다.
- 결과 해석
Blocking Hit, Hit Actor, Hit Location, Hit Normal로 다음 행동을 결정한다.
- 디버그 확인
Draw Debug Type으로 선과 형태를 화면에 보여주며 콜리전 설정을 검증한다.
환경 쿼리와 트레이싱이란 무엇인가?
환경 쿼리(Environment Query)는 특정 조건에 맞는 환경 정보를 질의하는 포괄적인 개념입니다.
언리얼 엔진에서는 주로 EQS (Environment Query System)를 통해 구현되지만, 여기서는 좀 더 기본적인 Trace 기능을 이용한 쿼리 방식을 다룹니다.
트레이싱(Tracing)은 가상의 선(Line) 또는 형태(Shape)를 월드에 발사해 특정 콜리전(Collision) 오브젝트와 교차하는지 확인하는 메커니즘입니다.
물리 시뮬레이션 결과와 분리해 콜리전 메시 기준으로 빠르게 판정할 수 있기 때문에, 환경 정보를 정확하게 수집하는 데 매우 유용합니다.
트레이스는 월드에 질문을 던지는 도구입니다. 시작점, 끝점, 채널, 결과 해석이 맞아야 게임플레이 판정이 흔들리지 않습니다.
- 1Line Trace
시야, 총알, 상호작용처럼 얇은 직선 판정에 맞습니다.
- 2Shape Trace
근접 공격, 배치 검사처럼 부피가 필요한 판정에 씁니다.
- 3Ignore Actors
자기 자신이나 팀원을 제외해야 오판정을 줄입니다.
- 4Debug Draw
초기 구현 단계에서는 선과 충돌점을 반드시 눈으로 확인합니다.
- 5블루프린트 점검
Start와 End가 월드 좌표인지 로컬 좌표인지 먼저 확인합니다. Trace Channel이 대상 콜리전 응답과 맞는지 확인합니다. Out Hit 구조체에서 Actor, Location, Normal을 목적에 맞게 분리합니다.
- 6결과 해석
Blocking Hit 충돌 여부 Hit Actor 대상 Hit Location 위치 Hit Normal 방향
- 시야/가시성 검사: AI가 플레이어를 볼 수 있는지, 플레이어가 엄폐물 뒤에 있는지 확인합니다.
- 길 찾기/도달 가능성: 특정 지점으로 이동하는 경로가 막혀있는지 확인하거나, 점프 가능한 지점을 찾습니다.
- 공격/능력 범위 판정: 총알이나 스킬이 적에게 명중했는지, 범위 내에 적이 있는지 판정합니다.
- 상호작용 감지: 플레이어의 시선 앞에 상호작용 가능한 오브젝트(문, 스위치, 아이템)가 있는지 감지합니다.
- 배치 검사: 오브젝트를 배치할 때 다른 오브젝트와 겹치지 않는지 확인합니다.
AI가 위치를 선택하는 문제에서는 EQS와 Trace를 함께 쓰는 방식이 특히 유용합니다.
EQS가 가능한 후보 위치를 만들고 점수로 우선순위를 정하면, Trace는 그 후보가 실제 월드에서 시야, 충돌, 도달 가능성 조건을 통과하는지 검증합니다.
AI가 엄폐 위치나 이동 목표를 고를 때는 먼저 후보를 넓게 만들고, 점수가 높은 위치를 시야, 충돌, 도달 가능성으로 다시 걸러야 합니다.
- EQS 후보 생성
플레이어 주변, AI 반경, 내비메시 위 지점처럼 검색 공간을 먼저 제한합니다. Generator 가능한 지점들을 일정 간격으로 뽑습니다. Test 거리, 각도, 태그, 내비mesh 조건으로 점수를 줍니다.
- 후보 점수화
점수는 우선순위일 뿐입니다. 가장 높은 후보도 벽 뒤나 막힌 곳이면 탈락할 수 있습니다. 92 A 지점 엄폐 각도 좋음, 플레이어와 거리 적절 78 B 지점 가깝지만 시야가 너무 열려 있음 64 C 지점 점수는 낮지만 우회 경로가 안정적
- A 지점
엄폐 각도 좋음, 플레이어와 거리 적절
- B 지점
깝지만 시야가 너무 열려 있음
- C 지점
점수는 낮지만 우회 경로가 안정적
- Trace 검증
후보 좌표를 바로 쓰기 전에 실제 월드 상태와 콜리전 응답을 확인해 실패 위치를 제거합니다. OK 시야 Line Trace로 장애물 가림 여부를 확인합니다. OK 충돌 Capsule Trace로 캐릭터가 설 공간을 확인합니다. ALT 도달 막힌 경로면 다음 점수 후보를 다시 검증합니다.
트레이싱의 종류와 활용
라인, 박스, 스피어 트레이스는 찾고 싶은 대상의 형태와 허용 오차에 따라 달라집니다.
- 목적 정의
사격, 상호작용, 시야, 영역 탐색 중 어떤 판정인지 먼저 고정합니다. Intent
- 형태 선택
정밀한 광선은 Line, 여유 폭은 Sphere, 상자형 공간은 Box를 씁니다. Shape
- 채널 지정
Visibility, Camera, 커스텀 채널 중 게임 규칙과 맞는 채널을 고릅니다. Channel
- 결과 필터링
Actor, Component, Tag, Interface로 실제 반응 대상을 좁힙니다. Filter
- 디버그 표시
개발 중에는 Draw Debug로 실제 시작점과 끝점을 확인합니다.
- Self 제외
자기 자신이나 장착 컴포넌트가 먼저 맞지 않도록 제외 목록을 둡니다.
- 호출 빈도
매 Tick 호출이 필요한지 입력 시점 호출로 충분한지 분리합니다.
트레이싱은 발사하는 가상의 형태에 따라 여러 종류가 있습니다.
가장 흔하게 사용되는 트레이싱은 다음과 같습니다.
라인 트레이스 (Line Trace)
가장 기본적인 트레이싱으로, 한 지점에서 다른 지점까지 직선을 발사합니다.
-
블루프린트 노드
Line Trace By Channel: 특정 콜리전 채널을 사용하여 트레이스합니다.Line Trace By Object Types: 특정 오브젝트 타입만을 대상으로 트레이스합니다.Line Trace For Objects: 특정 오브젝트 클래스만을 대상으로 트레이스합니다.
-
주요 입력 핀
Start: 트레이스를 시작할 월드 위치 (Vector)End: 트레이스가 끝날 월드 위치 (Vector)Trace Channel/Object Types/Object Classes: 어떤 콜리전 채널/오브젝트 타입을 검사할지 지정합니다.Ignore Actors: 트레이스에서 무시할 액터 배열 (예: 트레이스 발사 액터 자신)Draw Debug Type: 디버그 라인을 그릴지 여부 (None,For One Frame,For Duration)
-
주요 출력 핀 (
Out Hit구조체)Blocking Hit: 트레이스가 무엇인가에 의해 막혔는지 (Bool)Hit Actor: 충돌한 액터 (Actor Reference)Hit Component: 충돌한 컴포넌트 (Primitive Component Reference)Hit Location: 충돌이 발생한 월드 위치 (Vector)Hit Normal: 충돌 지점의 표면 법선 벡터 (Vector)Distance: 시작점부터 충돌 지점까지의 거리 (Float)Impact Point: 충돌 지점 (Hit Location과 같거나 약간 다를 수 있음)Impact Normal: 충돌 지점의 표면 법선 (Hit Normal과 같거나 약간 다를 수 있음)
-
총알 명중 판정
Start는 총구 위치,End는 총구 위치 +총구 방향 * 최대 사거리로 설정.Trace Channel은Visibility(가시성) 또는 커스텀Projectile채널.Hit Actor가 플레이어/적일 경우 데미지 적용.Hit Location에 총알 박히는 이펙트 생성.-
블루프린트 로직
(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.Ignore Actors에 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/Capsule): 트레이스 형태의 회전 (Rotator)- 나머지 핀은 라인 트레이스와 유사합니다.
-
주요 출력 핀
- 단일
Out Hit(가장 먼저 충돌한 오브젝트) 또는Out Hits(충돌한 모든 오브젝트 배열,Multi버전의 트레이스 노드 사용 시)
- 단일
-
근접 공격 범위 판정
- 캐릭터 전방에
Sphere Trace또는Box Trace를 짧게 발사. Trace Channel을Pawn또는Character로 설정하여 적만 감지.Multi버전을 사용하여 범위 내 모든 적을 감지하고 데미지 적용.
- 캐릭터 전방에
-
환경 배치 검사
- 새 오브젝트를 배치하려는 위치에
Box Trace를 발사하여 기존 오브젝트와 겹치는지 확인. - 겹칠 경우 빨간색으로 표시하거나 배치 불가능 처리.
- 새 오브젝트를 배치하려는 위치에
트레이싱 디버깅
Draw Debug Type 핀을 For Duration 또는 For One Frame으로 설정하여 트레이스 라인이나 형태를 시각적으로 확인하는 것이 디버깅의 핵심입니다.
Draw Debug Type을 켰다면 선이 보이는지보다 Start, End, Channel, Ignore 목록이 의도와 맞는지를 함께 읽어야 합니다.
- Start 위치
카메라, 총구, AI 눈 중 어디에서 시작해야 하는지 먼저 고정합니다.
- End 계산
Forward Vector와 거리 곱이 맞아야 원하는 방향과 사거리로 검사됩니다.
- Channel 응답
Visibility나 커스텀 채널에 대상 컴포넌트가 Block 또는 Overlap하는지 확인합니다.
- Ignore 목록
자기 자신을 맞추는 문제는 Ignore Actors에 발사 액터를 넣어 줄입니다.
For One Frame: 매 프레임마다 트레이스를 그려 한 순간의 상태를 확인합니다.For Duration: 일정 시간 동안 트레이스를 그려서 지속적인 움직임에 따른 트레이스 변화를 확인합니다.
트레이싱 사용 시 고려사항
- 콜리전 설정의 중요성: 트레이싱은 액터의 콜리전 설정(
Object Type,Trace Responses)에 따라 결과가 달라집니다. 원하는 대로 작동하지 않는다면 액터의 콜리전 설정을 다시 확인해야 합니다. - 성능: 트레이싱은 비교적 저렴한 연산이지만, 너무 자주(예: 매 프레임, 많은 액터에서) 긴 거리를 트레이스하면 성능에 영향을 줄 수 있습니다. 필요한 경우에만 실행하고, 거리를 최소화하는 것이 좋습니다.
- 정확도 vs. 성능:
Trace는 물리 시뮬레이션보다 빠르지만, 완벽한 물리 반응(예: 충돌 시 오브젝트 튕겨 나가기)을 제공하지는 않습니다. 용도에 맞게 선택해야 합니다. - 오너십 및 네트워크: 멀티플레이어 환경에서는 트레이스 로직을 주로 서버에서 실행하는 것이 안전합니다. 클라이언트에서 트레이스 결과에 따라 중요한 게임플레이 로직을 처리하면 클라이언트 조작의 여지가 생길 수 있습니다. (예: 총알 명중 판정은 반드시 서버에서!)
환경 쿼리와 트레이싱은 게임 세계의 정보를 얻고, AI의 의사결정, 플레이어의 상호작용, 전투 시스템 등 다양한 게임플레이 로직을 구현하는 데 필수적인 도구입니다.
콜리전 시스템과 함께 이들을 능숙하게 활용하는 것이 언리얼 엔진 개발의 핵심 역량 중 하나입니다.
트레이스 결과가 기대와 다를 때는 시작점, 채널, 무시 목록, 출력 구조체를 순서대로 분리해 확인합니다.
라인 트레이스와 셰이프 트레이스는 시작점, 끝점, 채널, 무시 목록이 조금만 달라도 완전히 다른 결과를 반환합니다.
- 위치 고정
Start 카메라, 총구, AI 눈 위치 중 어느 지점에서 쏘는지 명확히 합니다.
- 끝점 계산
Range Forward Vector와 거리 곱이 원하는 방향과 길이를 만드는지 확인합니다.
- 응답 선택
Channel Visibility, Camera, Pawn 같은 채널 응답이 대상 컴포넌트와 맞는지 봅니다.
- 자기 제외
Ignore 발사자와 부착 컴포넌트가 자기 자신을 먼저 맞히지 않도록 제외합니다.
- Blocking Hit막혔는지 판단
Blocking Hit False라면 로직보다 콜리전 응답과 거리 계산을 먼저 의심합니다.
- Hit Actor대상 분기
Hit Actor 캐스팅 전에 실제 맞은 액터가 의도한 클래스인지 출력합니다.
- Hit Normal표면 방향
Hit Normal 이펙트 회전과 반사 방향은 Impact Normal 기준으로 맞춥니다.
이번 절에서는 라인 트레이스와 박스 트레이스처럼 환경 정보를 조회하는 트레이싱 기능의 기본 사용법과 디버깅 방법을 다뤘습니다.
트레이싱은 상호작용, 피격 판정, 시야 확인 같은 게임플레이 로직에서 자주 사용됩니다.
Line Trace by Channel/Object와 Sphere, Box, Capsule Trace는 충돌 채널, Sweep 형태, Out Hit 개수에 따라 조준 판정과 상호작용 비용이 달라집니다.
- Line Trace by Channel/Object
By Channel 카메라 조준, 커서 클릭, Visibility 판정처럼 얇은 선 하나면 충분할 때 사용합니다.
- Sphere / Box / Capsule Trace
Sweep 문 손잡이, 근접 공격, 픽업 범위처럼 오차 여유가 필요하면 Sweep 반경을 줍니다.
- Single Hit와 Multi Hit
Out Hit 가장 가까운 Blocking Hit만 필요하면 Single, 관통 후보나 우선순위 정렬이 필요할 때 Multi를 씁니다.