Unreal

[Unreal5] Trace(추적시스템)와 충돌

usingsystem 2024. 6. 11. 23:23
728x90

https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Tracing/Overview/

 

트레이스 개요

언리얼 엔진 4 의 트레이스 시스템 개요입니다.

docs.unrealengine.com

 

Trace

Trace는 주로 레이캐스팅(raycasting)와 비슷하다. 게임이나 애니메이션에서 주어진 선상의 객체와의 충돌을 감지하는 데 사용됩니다. 레이캐스팅은 특정 방향으로 레이(선)를 발사하여 그 선상에서 충돌하는 객체를 찾아내는 방법입니다.

 

Sphere Trace by Channel

Sphere Trace by Channel은 구 형태의 레이캐스팅을 수행하여 특정 채널에서 충돌을 감지합니다. 여기서 채널(Channel)은 충돌을 감지할 때의 특정 규칙을 정의한 것입니다.

  • 구의 중심과 반경을 정의하여 레이캐스팅을 수행합니다.
  • 채널을 지정하여 해당 채널에 속하는 객체들과의 충돌을 감지합니다.
  • 결과로 충돌한 객체의 정보(위치, 표면 정보 등)를 반환합니다.

이 방식은 주로 물리적 충돌 감지, 거리 측정, 그리고 객체의 존재 유무를 파악하는 데 사용됩니다.

 

Sphere를 사용할 때 감지하고 싶은 객체의 Trace 채널 반드시 블록으로 설정되어있어야 한다.

// 충돌 정보를 저장할 변수
FHitResult OutHit;
// 레이의 시작 지점
FVector Start = FVector(0.f, 0.f, 0.f);
// 레이의 끝 지점
FVector End = FVector(1000.f, 0.f, 0.f);
// 구의 반경
float Radius = 50.f;
// 충돌 쿼리 파라미터
FCollisionQueryParams CollisionParams;

// Sphere Trace by Channel을 수행하여 충돌 감지
bool bHit = GetWorld()->SweepSingleByChannel(
    OutHit,                      // 충돌 결과를 저장할 변수
    Start,                       // 레이의 시작 지점
    End,                         // 레이의 끝 지점
    FQuat::Identity,             // 회전 (기본값 사용)
    ECC_Visibility,              // 충돌 채널 (여기서는 Visibility 채널 사용)
    FCollisionShape::MakeSphere(Radius),  // 구의 충돌 형태
    CollisionParams              // 충돌 쿼리 파라미터
);

// 충돌이 감지된 경우
if (bHit)
{
    // 충돌 처리 로직 (예: 충돌한 객체의 정보 출력)
    UE_LOG(LogTemp, Warning, TEXT("Hit: %s"), *OutHit.Actor->GetName());
}

 

Multi Sphere Trace for Objects

Multi Sphere Trace for Objects는 다수의 구 형태의 레이를 발사하여 객체와의 충돌을 감지하는 방법입니다.

  • 여러 구의 중심과 반경을 지정하여 동시에 레이캐스팅을 수행합니다.
  • 객체(Object)와의 충돌을 감지하며, 지정된 객체들만을 대상으로 합니다.
  • 각 구가 충돌한 객체의 정보를 반환합니다.

이 방식은 한 번에 여러 위치에서 충돌 감지를 해야 하는 경우에 유용합니다. 예를 들어, 캐릭터의 여러 부위에서 충돌을 감지하거나, 여러 포인트에서 장애물을 감지할 때 사용할 수 있습니다.

// 충돌 정보를 저장할 배열
TArray<FHitResult> OutHits;
// 레이의 시작 지점
FVector Start = FVector(0.f, 0.f, 0.f);
// 레이의 끝 지점
FVector End = FVector(1000.f, 0.f, 0.f);
// 구의 반경
float Radius = 50.f;

// 충돌할 객체 유형 설정
FCollisionObjectQueryParams ObjectQueryParams;
ObjectQueryParams.AddObjectTypesToQuery(ECC_WorldStatic);  // 정적 객체
ObjectQueryParams.AddObjectTypesToQuery(ECC_WorldDynamic); // 동적 객체

// 충돌 쿼리 파라미터
FCollisionQueryParams CollisionParams;

// Multi Sphere Trace for Objects를 수행하여 충돌 감지
bool bHit = GetWorld()->SweepMultiByObjectType(
    OutHits,                      // 충돌 결과를 저장할 배열
    Start,                        // 레이의 시작 지점
    End,                          // 레이의 끝 지점
    FQuat::Identity,              // 회전 (기본값 사용)
    ObjectQueryParams,            // 객체 유형 쿼리 파라미터
    FCollisionShape::MakeSphere(Radius),  // 구의 충돌 형태
    CollisionParams               // 충돌 쿼리 파라미터
);

// 충돌이 감지된 경우
if (bHit)
{
    // 각 충돌 처리 로직
    for (auto& Hit : OutHits)
    {
        // 충돌한 객체의 정보 출력
        UE_LOG(LogTemp, Warning, TEXT("Hit: %s"), *Hit.Actor->GetName());
    }
}

Line Trace by Channel

Line Trace by Channel은 지정된 시작 지점(Start)에서 끝 지점(End)까지의 선을 따라 충돌을 감지합니다. 충돌 채널(Channel)은 어떤 유형의 충돌을 감지할지를 설정하는 것으로, Visibility, Camera, Pawn 등 다양한 채널을 사용할 수 있습니다. 보통 사격때 사용

// 충돌 정보를 저장할 변수
FHitResult OutHit;

// 레이의 시작 지점 (예: 플레이어의 위치)
FVector Start = FVector(0.f, 0.f, 0.f);

// 레이의 끝 지점 (예: 플레이어 앞쪽으로 1000 유닛 떨어진 위치)
FVector End = FVector(1000.f, 0.f, 0.f);

// 충돌 쿼리 파라미터
FCollisionQueryParams CollisionParams;

// Line Trace by Channel을 수행하여 충돌 감지
bool bHit = GetWorld()->LineTraceSingleByChannel(
    OutHit,                      // 충돌 결과를 저장할 변수
    Start,                       // 레이의 시작 지점
    End,                         // 레이의 끝 지점
    ECC_Visibility,              // 충돌 채널 (여기서는 Visibility 채널 사용)
    CollisionParams              // 충돌 쿼리 파라미터
);

// 충돌이 감지된 경우
if (bHit)
{
    // 충돌 처리 로직 (예: 충돌한 객체의 정보 출력)
    UE_LOG(LogTemp, Warning, TEXT("Hit: %s"), *OutHit.Actor->GetName());
}

Sphere Trace by Profile

구 형태의 볼륨을 사용하여 특정 프로파일에 따라 충돌을 감지합니다. Preset(혹은 Profile)은 충돌 설정의 집합으로, 각 객체에 대해 어떤 방식으로 충돌을 감지할지 정의합니다.

// 충돌 정보를 저장할 변수
FHitResult OutHit;
// 레이의 시작 지점
FVector Start = FVector(0.f, 0.f, 0.f);
// 레이의 끝 지점
FVector End = FVector(1000.f, 0.f, 0.f);
// 구의 반경
float Radius = 50.f;
// 충돌 쿼리 파라미터
FCollisionQueryParams CollisionParams;

// Sphere Trace by Profile을 수행하여 충돌 감지
bool bHit = GetWorld()->SweepSingleByProfile(
    OutHit,                      // 충돌 결과를 저장할 변수
    Start,                       // 레이의 시작 지점
    End,                         // 레이의 끝 지점
    FQuat::Identity,             // 회전 (기본값 사용)
    TEXT("MyProfileName"),       // 충돌 프로파일 이름
    FCollisionShape::MakeSphere(Radius),  // 구의 충돌 형태
    CollisionParams              // 충돌 쿼리 파라미터
);

// 충돌이 감지된 경우
if (bHit)
{
    // 충돌 처리 로직 (예: 충돌한 객체의 정보 출력)
    UE_LOG(LogTemp, Warning, TEXT("Hit: %s"), *OutHit.Actor->GetName());
}
728x90