콘텐츠로 이동

UE5 Collision & Trace Channel

UE5의 콜리전 시스템은 Object Channel(오브젝트가 “무엇인가”), Trace Channel(쿼리가 “무엇을 찾는가”), Collision Preset(각 채널에 대한 반응 규칙)의 세 가지 개념으로 구성됩니다. 이 세 가지를 정확히 이해하지 않으면 의도치 않은 충돌 무시나 과도한 쿼리 비용이 발생합니다.


구분역할설정 위치
Object Channel컴포넌트 자체의 “타입”Collision > Object Type
Trace ChannelLineTrace/SweepTrace가 감지할 대상Collision > Collision Responses의 해당 채널
프로젝트 설정 → Engine → Collision
Object Channels: WorldStatic, WorldDynamic, Pawn, PhysicsBody, Vehicle, Destructible
Trace Channels: Visibility, Camera (기본 제공)

커스텀 채널은 여기서 추가합니다. 게임에서 자주 쓰는 예시:

  • TraceChannel_Weapon — 무기 히트스캔 전용
  • TraceChannel_Interaction — 상호작용 오브젝트 감지

MyCharacter.cpp
bool AMyCharacter::PerformWeaponTrace(FHitResult& OutHit) const
{
UWorld* World = GetWorld();
if (!World) return false;
FVector Start = GetActorLocation() + FVector(0, 0, 60.f);
FVector End = Start + GetActorForwardVector() * 3000.f;
// 쿼리 파라미터: 자기 자신 무시
FCollisionQueryParams Params(TEXT("WeaponTrace"), /*bTraceComplex=*/false);
Params.AddIgnoredActor(this);
Params.bReturnPhysicalMaterial = true;
// ECC_GameTraceChannel1 = 프로젝트 설정에서 추가한 첫 번째 커스텀 채널
return World->LineTraceSingleByChannel(
OutHit,
Start, End,
ECC_GameTraceChannel1,
Params
);
}
TArray<FHitResult> Hits;
bool bHit = World->LineTraceMultiByChannel(
Hits, Start, End,
ECC_Visibility,
Params
);
for (const FHitResult& Hit : Hits)
{
if (AActor* HitActor = Hit.GetActor())
{
UE_LOG(LogTemp, Log, TEXT("Hit: %s at %.1f cm"),
*HitActor->GetName(), Hit.Distance);
}
}

총알처럼 얇은 트레이스는 빠른 오브젝트를 놓칠 수 있습니다. SweepSingleByChannel은 구 또는 캡슐 형태의 볼륨으로 트레이스합니다.

bool AMyCharacter::PerformSweepAttack(FHitResult& OutHit) const
{
FVector Start = GetActorLocation();
FVector End = Start + GetActorForwardVector() * 200.f;
// 반지름 40cm 구 스윕
FCollisionShape SweepShape = FCollisionShape::MakeSphere(40.f);
FCollisionQueryParams Params;
Params.AddIgnoredActor(this);
return GetWorld()->SweepSingleByChannel(
OutHit,
Start, End,
FQuat::Identity,
ECC_GameTraceChannel1,
SweepShape,
Params
);
}

채널 대신 Object Type으로 쿼리하면 특정 타입의 오브젝트만 감지할 수 있습니다.

// Pawn과 PhysicsBody 타입만 감지
FCollisionObjectQueryParams ObjParams;
ObjParams.AddObjectTypesToQuery(ECC_Pawn);
ObjParams.AddObjectTypesToQuery(ECC_PhysicsBody);
TArray<FHitResult> Hits;
GetWorld()->LineTraceMultiByObjectType(
Hits, Start, End, ObjParams, QueryParams
);

5. Collision Response 설정 — C++ 프리셋

섹션 제목: “5. Collision Response 설정 — C++ 프리셋”
// 컴포넌트 생성 시 콜리전 프리셋 코드로 설정
UCapsuleComponent* Capsule = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Capsule"));
Capsule->SetCollisionProfileName(TEXT("Pawn")); // 프리셋 이름으로 한번에 설정
// 또는 채널별로 직접 지정
Capsule->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
Capsule->SetCollisionObjectType(ECC_Pawn);
Capsule->SetCollisionResponseToAllChannels(ECR_Block);
Capsule->SetCollisionResponseToChannel(ECC_Camera, ECR_Ignore);
Capsule->SetCollisionResponseToChannel(ECC_GameTraceChannel1, ECR_Block);

프로젝트 설정에서 추가한 채널을 코드에서 읽기 좋게 이름을 붙여둡니다.

CollisionChannels.h
#pragma once
#include "Engine/EngineTypes.h"
// 프로젝트 설정에서 추가한 커스텀 트레이스 채널
static constexpr ECollisionChannel CC_Weapon = ECC_GameTraceChannel1;
static constexpr ECollisionChannel CC_Interaction = ECC_GameTraceChannel2;
static constexpr ECollisionChannel CC_Projectile = ECC_GameTraceChannel3;

  • Object Channel은 “나는 무엇인가”, Trace Channel은 “나는 무엇을 찾는가”를 정의한다.
  • LineTraceSingleByChannel은 첫 번째 히트만 반환하고, Multi는 모든 히트를 반환한다.
  • 빠르게 이동하는 오브젝트나 근접 공격 판정에는 SweepSingleByChannel을 사용한다.
  • 커스텀 채널은 프로젝트 설정에서 추가하고, 코드에서 ECC_GameTraceChannelN alias를 상수로 정의해 가독성을 높인다.