icon안동민 개발노트

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


 언리얼 엔진의 환경 쿼리와 트레이싱 기능은 게임 월드와 상호작용하고 정보를 수집하는 강력한 도구입니다.

 이 절에서는 블루프린트에서 이러한 기능을 활용하는 방법을 살펴보겠습니다.

라인 트레이스

 라인 트레이스는 시작점에서 끝점까지 직선을 그어 충돌을 감지하는 방법입니다.

[Line Trace By Channel]
Start: GetActorLocation()
End: Start + (GetActorForwardVector() * 1000)
Trace Channel: Visibility
    |
[Branch: Hit?]
    |
[Print String] <-- True
String: "Hit object: " + HitResult.GetActor().GetName()
라인 트레이스 노드 구성

 활용 사례 : 발사체 궤적, 시야 체크

스피어 트레이스

 스피어 트레이스는 구 형태로 충돌을 감지합니다.

[Sphere Trace By Channel]
Start: GetActorLocation()
End: Start + (GetActorForwardVector() * 500)
Radius: 50
Trace Channel: Visibility
    |
[ForEachLoop: Hit Results]
    |
[Apply Damage]
스피어 트레이스 노드 구성

 활용 사례 : 범위 공격, 근접 적 감지

박스 트레이스

 박스 트레이스는 직육면체 형태로 충돌을 감지합니다.

[Box Trace By Channel]
Start: GetActorLocation()
End: Start + (GetActorForwardVector() * 300)
Half Size: (X=50, Y=50, Z=100)
Orientation: GetActorRotation()
Trace Channel: Visibility
    |
[Get Overlapping Actors]
박스 트레이스 노드 구성

 활용 사례 : 영역 효과, 트리거 영역 설정

오버랩 이벤트

 오버랩 이벤트를 사용하여 지속적인 충돌 감지를 할 수 있습니다.

[Event ActorBeginOverlap]
    |
[Cast To Character]
    |
[Branch: Success?]
    |
[Apply Effect] <-- True
 
[Event ActorEndOverlap]
    |
[Remove Effect]
오버랩 이벤트 처리

히트 결과 해석 및 처리

 트레이스 결과로 얻은 정보를 활용하는 방법

[Line Trace By Channel]
    |
[Break Hit Result]
    |
[Get Impact Point]
[Get Hit Component]
[Get Hit Bone Name]
    |
[Apply Damage at Location]
히트 결과 처리

트레이싱을 이용한 상호작용 구현

 예 : 시야 체크 시스템

[Line Trace By Channel]
Start: PlayerEyeLocation
End: TargetLocation
Trace Channel: Visibility
    |
[Branch: Blocked?]
    |
[Set Is Visible] <-- False
    |
[Set Is Visible] <-- True
시야 체크 시스템

환경 쿼리 시스템 (EQS) 기본

 EQS는 AI의 의사 결정을 위한 고급 쿼리 시스템입니다.

  1. EQS 쿼리 생성
  • 콘텐츠 브라우저에서 AI > Environment Query 선택
  1. 제너레이터 및 테스트 설정
  2. 블루프린트에서 EQS 쿼리 실행
[Run EQS Query]
Query Template: MyEQSQuery
Querier: Self
    |
[Get Query Results]
    |
[ForEachLoop]
    |
[Do Something with Result]
EQS 쿼리 실행

 활용 사례: 최적의 위치 찾기, 동적 커버 포인트 선정

성능 영향 및 최적화

 트레이싱과 쿼리는 성능에 영향을 줄 수 있으므로 최적화가 중요합니다:

  1. 트레이스 빈도 조절
  • 매 프레임 대신 일정 간격으로 수행
  1. 트레이스 복잡도 조절
  • 필요 이상의 복잡한 트레이스 피하기
  1. 채널 및 오브젝트 타입 최적화
  • 필요한 채널과 오브젝트만 대상으로 트레이스
  1. EQS 쿼리 최적화
  • 쿼리 아이템 수와 테스트 수 제한

 성능 최적화 예제

[Tick Event]
    |
[Branch: Time Since Last Trace > 0.5s?]
    |
[Perform Trace] <-- True
    |
[Set Last Trace Time]
트레이스 최적화 예제

고급 트레이싱 기법

  1. 멀티 트레이스
  • 여러 방향으로 동시에 트레이스 수행
[Multi Line Trace By Channel]
Start: GetActorLocation()
End: GenerateTraceEndPoints()
Trace Channel: Visibility
    |
[ForEachLoop: Hit Results]
    |
[Process Each Hit]
  1. 지속적인 트레이스
  • 움직이는 물체를 따라가는 트레이스
[Timeline]
    |
[Lerp]
Start: InitialPosition
End: TargetPosition
Alpha: Timeline_0_1
    |
[Line Trace By Channel]
Start: LerpResult
End: LerpResult + (DownVector * 100)
  1. 콤플렉스 트레이스
  • 정확한 메시 형태를 따라 트레이스
[Line Trace For Objects]
Object Types: WorldStatic, WorldDynamic
Start: TraceStart
End: TraceEnd
Trace Complex: True
고급 트레이싱 기법

EQS 고급 활용

  1. 커스텀 EQS 테스트 생성
  • 특정 게임플레이 요구사항에 맞는 테스트 구현
  1. EQS 컨텍스트 활용
  • 동적 쿼리 파라미터 설정
  1. EQS 디버깅
  • 에디터에서 EQS Testing Pawn 사용
[Run EQS Query]
Query Template: AdvancedPositioning
Querier: Self
RunMode: EnvQueryRunMode::SingleResult
    |
[Get Query Result as Location]
    |
[Move To Location]
EQS 고급 활용

 환경 쿼리와 트레이싱은 게임 월드와 상호작용하고 정보를 수집하는 핵심적인 도구입니다. 이를 통해 충돌 감지, 시야 체크, AI 의사결정 등 다양한 게임플레이 기능을 구현할 수 있습니다.

 효과적인 사용을 위해서는 각 기능의 특성과 성능 영향을 잘 이해하고, 게임의 요구사항에 맞게 적절히 활용해야 합니다. 특히 대규모 레벨이나 많은 액터가 있는 경우, 트레이싱과 쿼리의 최적화는 매우 중요합니다.

 지속적인 프로파일링과 최적화를 통해 효율적이면서도 정확한 환경 상호작용 시스템을 구축할 수 있습니다. 또한, 디버깅 도구를 적극 활용하여 복잡한 쿼리나 트레이스의 동작을 시각적으로 확인하고 문제를 신속하게 해결할 수 있습니다.