UE5 Collision & Trace Channel
UE5의 콜리전 시스템은 Object Channel(오브젝트가 “무엇인가”), Trace Channel(쿼리가 “무엇을 찾는가”), Collision Preset(각 채널에 대한 반응 규칙)의 세 가지 개념으로 구성됩니다. 이 세 가지를 정확히 이해하지 않으면 의도치 않은 충돌 무시나 과도한 쿼리 비용이 발생합니다.
1. Object Channel vs Trace Channel
섹션 제목: “1. Object Channel vs Trace Channel”| 구분 | 역할 | 설정 위치 |
|---|---|---|
| Object Channel | 컴포넌트 자체의 “타입” | Collision > Object Type |
| Trace Channel | LineTrace/SweepTrace가 감지할 대상 | Collision > Collision Responses의 해당 채널 |
프로젝트 설정 → Engine → Collision Object Channels: WorldStatic, WorldDynamic, Pawn, PhysicsBody, Vehicle, Destructible Trace Channels: Visibility, Camera (기본 제공)커스텀 채널은 여기서 추가합니다. 게임에서 자주 쓰는 예시:
TraceChannel_Weapon— 무기 히트스캔 전용TraceChannel_Interaction— 상호작용 오브젝트 감지
2. C++ LineTrace 기본
섹션 제목: “2. C++ LineTrace 기본”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 );}2.1 다중 히트 (LineTraceMulti)
섹션 제목: “2.1 다중 히트 (LineTraceMulti)”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); }}3. SweepTrace — 부피가 있는 쿼리
섹션 제목: “3. SweepTrace — 부피가 있는 쿼리”총알처럼 얇은 트레이스는 빠른 오브젝트를 놓칠 수 있습니다. 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 );}4. Object Type 기반 쿼리
섹션 제목: “4. Object Type 기반 쿼리”채널 대신 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);6. 커스텀 채널 헤더 정의
섹션 제목: “6. 커스텀 채널 헤더 정의”프로젝트 설정에서 추가한 채널을 코드에서 읽기 좋게 이름을 붙여둡니다.
#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_GameTraceChannelNalias를 상수로 정의해 가독성을 높인다.