https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Tracing/Overview/
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());
}
'Unreal' 카테고리의 다른 글
[Unreal5] 캐릭터 회전 (0) | 2024.06.11 |
---|---|
[Unreal5] 데이터관리 (GameplayeTags, AssetManager, DataSet) (0) | 2024.06.05 |
[Unreal5] 입력 설정 함수 (0) | 2024.06.05 |
[Unreal5] Input Action와 Input Mapping Context 사용방법 (0) | 2024.06.03 |
[Unreal5] Component 추가 및 속성 변경 (0) | 2024.05.30 |