콜리전 채널과 프리셋
ECollisionChannel, Collision Profile, Trace/Overlap의 동작 원리
콜리전 시스템 개요
Object Channel, Trace Channel, Response의 관계
UE5의 콜리전 시스템은 세 가지 핵심 개념으로 구성됩니다: Object Channel(오브젝트가 무엇인지), Trace Channel(어떤 종류의 검사인지), Collision Response(어떻게 반응할지).
| 기본 Object Channel | 용도 | 예시 |
|---|---|---|
WorldStatic | 움직이지 않는 정적 오브젝트 | 바닥, 벽, 건물 |
WorldDynamic | 움직일 수 있는 동적 오브젝트 | 문, 물리 소품 |
Pawn | 플레이어/AI 캐릭터 | 캐릭터, NPC |
PhysicsBody | 물리 시뮬레이션 오브젝트 | 물리 큐브, 파편 |
Vehicle | 차량 | 자동차, 탱크 |
Destructible | 파괴 가능 오브젝트 | Geometry Collection |
| 기본 Trace Channel | 용도 |
|---|---|
Visibility | 시선 차단 검사 (LOS) |
Camera | 카메라 충돌 검사 |
Ignore: 완전히 무시. Overlap: 겹침 감지는 하지만 물리적 차단 없음 (OnOverlap 이벤트 발생). Block: 물리적으로 차단하며 충돌 (OnHit 이벤트 발생). 두 오브젝트 모두 Block이어야 실제로 차단됩니다.
커스텀 채널과 프리셋
프로젝트별 채널 추가와 프로파일 관리
기본 채널만으로 부족한 경우, Project Settings > Engine > Collision에서 커스텀 Object/Trace Channel을 추가할 수 있습니다. 최대 18개의 커스텀 채널(ECC_GameTraceChannel1~18)을 사용할 수 있습니다.
// DefaultEngine.ini에 정의된 커스텀 채널
// [/Script/Engine.CollisionProfile]
// +DefaultChannelResponses=(Channel=ECC_GameTraceChannel1, DefaultResponse=ECR_Block, bTraceType=False, bStaticObject=False, Name="Projectile")
// C++ 에서 커스텀 채널 정의 (헤더)
#define ECC_Projectile ECollisionChannel::ECC_GameTraceChannel1
#define ECC_Interactable ECollisionChannel::ECC_GameTraceChannel2
// 컴포넌트에 채널 설정
void AProjectile::SetupCollision()
{
SphereComp->SetCollisionObjectType(ECC_Projectile);
// 모든 채널 Ignore로 초기화 후 필요한 것만 Block/Overlap
SphereComp->SetCollisionResponseToAllChannels(ECR_Ignore);
SphereComp->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block);
SphereComp->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Block);
SphereComp->SetCollisionResponseToChannel(ECC_Pawn, ECR_Block);
}
자주 사용하는 채널/응답 조합은 Collision Preset(Profile)으로 저장해두세요. Project Settings에서 정의하면 에디터 드롭다운에 나타나고, C++에서는 SetCollisionProfileName("MyPreset")으로 한 줄로 적용할 수 있습니다.
Line Trace와 Sweep
레이캐스트와 형상 캐스트의 활용
// 1. Line Trace (레이캐스트)
FHitResult HitResult;
FVector Start = GetActorLocation();
FVector End = Start + GetActorForwardVector() * 5000.0f;
FCollisionQueryParams QueryParams;
QueryParams.AddIgnoredActor(this);
QueryParams.bTraceComplex = false; // Simple collision 사용
QueryParams.bReturnPhysicalMaterial = true;
bool bHit = GetWorld()->LineTraceSingleByChannel(
HitResult,
Start, End,
ECC_Visibility,
QueryParams
);
// 2. Sphere Sweep (구체 캐스트)
FCollisionShape Shape = FCollisionShape::MakeSphere(50.0f);
bHit = GetWorld()->SweepSingleByChannel(
HitResult,
Start, End,
FQuat::Identity,
ECC_Visibility,
Shape,
QueryParams
);
// 3. Overlap (겹침 검사)
TArray<FOverlapResult> Overlaps;
FCollisionShape OverlapShape = FCollisionShape::MakeSphere(500.0f);
GetWorld()->OverlapMultiByObjectType(
Overlaps,
GetActorLocation(),
FQuat::Identity,
FCollisionObjectQueryParams(ECC_Pawn),
OverlapShape,
QueryParams
);
| Trace 메서드 | 형상 | 대상 필터 | 반환 |
|---|---|---|---|
LineTraceSingleByChannel | 선(Ray) | Trace Channel | 첫 번째 Hit |
LineTraceMultiByChannel | 선(Ray) | Trace Channel | 모든 Hit |
SweepSingleByChannel | Sphere/Box/Capsule | Trace Channel | 첫 번째 Hit |
OverlapMultiByObjectType | 임의 형상 | Object Channel | 모든 Overlap |
LineTraceSingleByObjectType | 선(Ray) | Object Channel | 첫 번째 Hit |
ByChannel은 대상 오브젝트의 Collision Response를 확인합니다 (Block/Overlap/Ignore). ByObjectType은 대상의 Object Type만으로 필터링합니다. 게임플레이 목적(무기 히트 등)에는 ByChannel, 공간 쿼리(주변 적 탐색 등)에는 ByObjectType이 적합합니다.
Collision Enabled와 이벤트
콜리전 모드와 OnHit/OnOverlap 이벤트 처리
| ECollisionEnabled | 쿼리(Trace/Overlap) | 물리 시뮬레이션 | 사용 사례 |
|---|---|---|---|
NoCollision | X | X | 완전히 비활성화 |
QueryOnly | O | X | 트리거, 오버랩 전용 |
PhysicsOnly | X | O | 물리만, 쿼리 불필요 |
QueryAndPhysics | O | O | 일반적 물리 오브젝트 |
ProbeOnly | O (제한적) | X | CCD용 경량 쿼리 |
void AMyActor::BeginPlay()
{
Super::BeginPlay();
// OnHit 이벤트 바인딩 (Block 시 발생)
MeshComp->OnComponentHit.AddDynamic(this, &AMyActor::OnHit);
// OnOverlap 이벤트 바인딩 (Overlap 시 발생)
TriggerComp->OnComponentBeginOverlap.AddDynamic(this, &AMyActor::OnOverlapBegin);
// Generate Overlap Events가 true여야 Overlap 발생
TriggerComp->SetGenerateOverlapEvents(true);
}
void AMyActor::OnHit(
UPrimitiveComponent* HitComp,
AActor* OtherActor,
UPrimitiveComponent* OtherComp,
FVector NormalImpulse,
const FHitResult& Hit)
{
// NormalImpulse: 충돌 강도와 방향
float ImpactForce = NormalImpulse.Size();
UE_LOG(LogTemp, Log, TEXT("Hit! Force: %f"), ImpactForce);
}
핵심 요약
- 콜리전 시스템은 Object Channel(무엇인지), Trace Channel(검사 종류), Response(반응 방식)로 구성됩니다.
- 커스텀 채널은 최대 18개까지 추가 가능하며, Collision Preset으로 자주 쓰는 조합을 관리합니다.
LineTrace는 선 검사,Sweep은 형상 캐스트,Overlap은 범위 겹침 검사입니다.ByChannel은 응답 기반,ByObjectType은 타입 기반 필터링입니다.- 두 오브젝트 모두 Block이어야 실제로 물리적 차단이 발생합니다.
도전 과제
배운 내용을 직접 실습해보세요
Project Settings에서 커스텀 Object Channel 2개(Projectile, InteractableObject)를 추가하고, Projectile이 InteractableObject만 Block하고 나머지는 Overlap하도록 Collision Preset을 구성하세요.
커스텀 Trace Channel을 만들고 Line Trace를 사용하여 특정 채널의 액터만 감지하는 인터랙션 시스템을 구현하세요. 디버그 라인으로 Trace 결과를 시각화하세요.
Player, Enemy, Projectile, Shield, PickupItem 5가지 콜리전 프리셋을 설계하세요. Shield가 Projectile만 Block하고, PickupItem이 Player만 Overlap하는 완전한 콜리전 매트릭스를 구현하세요.