본문 바로가기
프로그래밍

👨‍💻 [Unreal] 언리얼 엔진 에서 스윕 트레이스 (Sweep Trace) 란 무엇이고, 어떻게 활용할 수 있나요?

by 밝음의기둥 2024. 12. 16.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

언리얼 엔진 에서 스윕 트레이스 (Sweep Trace) 란 무엇이고, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

언리얼 엔진 에서 스윕 트레이스 (Sweep Trace) 란 무엇이고, 어떻게 활용할 수 있나요?

답변 >

스윕 트레이스(Sweep Trace)는 언리얼 엔진에서 라인 트레이스(Line Trace)의 확장된 형태로, 단순히 직선을 따라 충돌을 감지하는 것이 아니라, 특정 형상(Shape)(박스, 구, 캡슐 등)을 따라 충돌을 검사합니다. 이를 통해 라인 트레이스보다 더 복잡하고 정확한 충돌 감지 및 상호작용을 구현할 수 있습니다.


스윕 트레이스의 주요 특징

  1. 형상 기반 충돌 감지:
    • 스윕 트레이스는 Box, Sphere, Capsule과 같은 형상을 사용하여 충돌을 감지합니다.
    • 라인 트레이스는 한 점에서 다른 점까지의 경로를 검사하지만, 스윕 트레이스는 부피를 검사합니다.
  2. 다양한 트레이스 결과 반환:
    • 충돌 여부, 충돌한 오브젝트, 충돌 지점, 표면의 법선(Normal) 등을 반환합니다.
  3. 채널 필터링:
    • 특정 충돌 채널(Collision Channel)을 사용하여 특정 유형의 오브젝트와만 충돌을 검사합니다.
  4. 싱글/멀티 트레이스 지원:
    • Single Sweep: 첫 번째 충돌만 반환.
    • Multi Sweep: 충돌하는 모든 오브젝트를 배열로 반환.

스윕 트레이스의 활용 방법

1. C++로 스윕 트레이스 구현

기본 코드 예제: 캡슐 스윕

void AMyCharacter::PerformCapsuleSweep()
{
    FVector Start = GetActorLocation(); // 시작 지점
    FVector End = Start + (GetActorForwardVector() * 500.0f); // 끝 지점

    // 캡슐의 반지름과 높이
    float CapsuleRadius = 50.0f;
    float CapsuleHalfHeight = 100.0f;

    // 충돌 결과를 저장할 배열
    TArray<FHitResult> HitResults;
    FCollisionShape CapsuleShape = FCollisionShape::MakeCapsule(CapsuleRadius, CapsuleHalfHeight);

    // 캡슐 스윕 실행
    bool bHit = GetWorld()->SweepMultiByChannel(
        HitResults,
        Start,
        End,
        FQuat::Identity,  // 회전 없음
        ECC_Visibility,   // 충돌 채널
        CapsuleShape
    );

    if (bHit)
    {
        for (const FHitResult& Hit : HitResults)
        {
            UE_LOG(LogTemp, Warning, TEXT("Hit Actor: %s"), *Hit.Actor->GetName());
        }
    }
}


2. 블루프린트에서 스윕 트레이스

Sphere Sweep Multi

  1. 노드 추가:
    • SphereTraceMultiByChannel 노드를 배치.
  2. 파라미터 설정:
    • Start: 트레이스 시작점.
    • End: 트레이스 끝점.
    • Radius: 구의 반지름.
    • Trace Channel: 충돌 채널 선택.
  3. 출력 핀 처리:
    • Out Hits 핀에서 충돌 정보를 배열로 반환받아 처리.

트레이스 형상

  1. Box:
    • 사각형 형상으로 충돌 감지.
    • 사용 함수: FCollisionShape::MakeBox(FVector HalfExtents).
  2. Sphere:
    • 구 형태로 충돌 감지.
    • 사용 함수: FCollisionShape::MakeSphere(float Radius).
  3. Capsule:
    • 캡슐 형상으로 충돌 감지.
    • 사용 함수: FCollisionShape::MakeCapsule(float Radius, float HalfHeight).

활용 예시

1. 물리적 상호작용

  • 스윕 트레이스를 사용하여 플레이어가 충돌할 수 있는 모든 물리적 오브젝트를 감지하고, 이를 이동, 밀기, 회전 등의 물리적 동작에 활용.

2. 플레이어 시야 검사

  • 구 스윕 트레이스를 사용해 플레이어 주변의 상호작용 가능한 오브젝트를 감지.

3. 적 AI 감지

  • 적 AI가 일정 거리 내에서 플레이어를 감지할 때, 구 스윕을 사용해 장애물까지 고려한 시야 감지를 구현.

4. 환경 스캐닝

  • 캡슐 스윕을 사용해 특정 공간에서 모든 오브젝트를 감지하고 정보를 수집.

싱글 스윕 vs 멀티 스윕

특징  Single Sweep  Multi Sweep
감지 대상 경로에서 첫 번째 충돌만 반환 경로에서 모든 충돌 반환
성능 성능이 더 우수 충돌 대상이 많아질수록 성능 저하
사용 사례 단일 대상과의 상호작용 다중 대상과의 상호작용

스윕 트레이스 디버깅

디버깅 시 스윕 경로를 시각화하면 충돌 경로와 결과를 더 쉽게 분석할 수 있습니다.

디버그 코드

#include "DrawDebugHelpers.h"DrawDebugCapsule(
    GetWorld(),
    Start,
    CapsuleHalfHeight,
    CapsuleRadius,
    FQuat::Identity,
    FColor::Red,
    false,
    1.0f
);


장점과 단점

장점

  1. 정확한 충돌 검사: 부피를 사용해 더 세밀한 충돌 검사가 가능.
  2. 복잡한 환경 처리: 단일 라인 트레이스로 감지할 수 없는 복잡한 충돌을 다룰 수 있음.
  3. 다양한 형상 지원: Box, Sphere, Capsule 등의 다양한 충돌 형상 제공.

단점

  1. 성능 비용: 충돌 검사 범위가 크거나 대상이 많아질수록 성능 저하 가능.
  2. 설정 복잡성: 라인 트레이스보다 설정과 구현이 복잡할 수 있음.

결론

스윕 트레이스는 라인 트레이스보다 더 정교하고 복잡한 충돌 감지가 필요한 상황에서 유용하게 사용됩니다. 이를 활용하면 캐릭터 이동, 상호작용 가능한 오브젝트 감지, 적의 시야 감지, 환경 스캐닝 등 다양한 게임플레이 기능을 구현할 수 있습니다. 적절한 형상 선택과 성능 최적화를 통해 스윕 트레이스를 효과적으로 활용하세요.


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌 1인 게

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형