1. Collision Filtering
언리얼 엔진 5(UE5)의 콜리전 필터링은 게임 월드 내의 오브젝트들이 서로 어떻게 상호작용할지를 결정하는 정교하고 강력한 시스템입니다. 이 시스템을 통해 오브젝트 간의 물리적 충돌, 겹침(Overlap) 이벤트, 그리고 레이캐스트(Raycast)와 같은 쿼리에 대한 반응을 세밀하게 제어할 수 있습니다.
게임플레이 메커니즘을 구현하고, 불필요한 연산을 줄여 퍼포먼스를 최적화하는 데 매우 중요한 역할을 합니다. 예를 들어, 플레이어 캐릭터는 벽을 통과할 수 없지만(Block), 아이템은 획득할 수 있도록 겹쳐야(Overlap) 하며, 총알은 적에게만 피해를 주도록(특정 채널에만 Block) 설정할 수 있습니다.
2. 핵심 개념 (Core Concepts)
콜리전 필터링 시스템은 크게 세 가지 요소(응답, 채널, 프리셋)를 기반으로 동작합니다.
2.1. 콜리전 응답 (Collision Response)
두 오브젝트가 상호작용할 때 어떤 일이 발생할지를 정의하며, 세 가지 유형이 있습니다.
- Ignore (무시): 두 오브젝트는 서로를 완전히 무시하고 통과합니다. 물리적 상호작용이나 이벤트가 발생하지 않아 연산 비용이 가장 적습니다.
- Overlap (겹침): 두 오브젝트는 서로를 통과하지만, 엔진은 이들이 겹쳤다는 사실을 감지하고
OnComponentBeginOverlap및OnComponentEndOverlap이벤트를 발생시킵니다. 아이템 획득, 트리거 볼륨 진입 감지 등에 주로 사용됩니다. - Block (블로킹): 두 오브젝트는 서로를 통과하지 못하고 물리적으로 충돌합니다. 충돌 시
OnComponentHit이벤트가 발생하며, 물리 시뮬레이션(반사, 마찰 등)이 적용될 수 있습니다. 벽, 바닥, 캐릭터 간의 충돌 등에 사용됩니다.
2.2. 콜리전 채널 (Collision Channel)
콜리전 채널은 오브젝트의 유형을 정의하거나 특정 쿼리의 목적을 나타내는 레이블입니다. 이를 통해 "어떤 종류의 오브젝트가" "어떤 종류의 다른 오브젝트와" 상호작용할지를 설정할 수 있습니다. 채널은 오브젝트 채널과 트레이스 채널 두 가지로 나뉩니다.
- 오브젝트 채널 (Object Channel): 오브젝트 자체의 유형을 정의합니다. (예:
WorldStatic,Pawn,Vehicle,Destructible). 각 액터의 콜리전 컴포넌트는 하나의 오브젝트 채널을 가집니다. 이 채널은 "나는 이런 종류의 오브젝트다"라고 선언하는 것과 같습니다. - 트레이스 채널 (Trace Channel): 라인 트레이스, 스윕 같은 씬 쿼리(Scene Query)가 특정 목적을 가지고 월드를 탐색할 때 사용됩니다. (예:
Visibility,Camera). 트레이스 채널은 "나는 이런 종류의 상호작용을 찾고 있다"라고 선언하는 것과 같습니다. 예를 들어,Visibility채널은 무언가 보이는지 여부를 확인하는 데 사용되고, 커스텀 채널인Weapon을 만들어 무기가 맞출 수 있는 오브젝트만 감지하도록 할 수 있습니다.
프로젝트 설정(Project Settings > Engine > Collision)에서 최대 32개의 오브젝트 채널과 32개의 트레이스 채널을 커스텀하게 생성하고 이름을 지정할 수 있습니다.
2.3. 콜리전 프리셋 (Collision Presets)
콜리전 프리셋은 특정 유형의 오브젝트에 대해 미리 설정된 콜리전 속성들의 묶음입니다. 프리셋에는 해당 오브젝트의 오브젝트 채널과, 다른 모든 오브젝트 채널에 대한 콜리전 응답(Ignore/Overlap/Block)이 정의되어 있습니다.
예를 들어, Pawn 프리셋은 기본적으로 오브젝트 채널이 Pawn으로 설정되어 있고, WorldStatic 채널과는 Block, Vehicle 채널과는 Overlap 등으로 미리 설정되어 있습니다. 이를 통해 매번 모든 채널에 대한 응답을 수동으로 설정할 필요 없이, "이 오브젝트는 캐릭터(Pawn)다"라고 프리셋만 지정해주면 일관된 콜리전 동작을 보장할 수 있습니다. 물론, 프리셋을 적용한 뒤 특정 채널에 대한 응답만 개별적으로 수정하는 것도 가능합니다.
3. 동작 원리 및 내부 구조
3.1. 상호작용 결정 로직
두 오브젝트(A, B)가 상호작용할 때, 최종적인 콜리전 응답은 두 오브젝트의 설정을 조합하여 결정됩니다. 구체적으로는 "더 약한(덜 제한적인) 상호작용"을 따릅니다.
- Block vs Block → Block
- Block vs Overlap → Overlap
- Block vs Ignore → Ignore
- Overlap vs Overlap → Overlap
- Overlap vs Ignore → Ignore
- Ignore vs Ignore → Ignore
예를 들어, 오브젝트 A가 B를 Block하도록 설정했더라도, B가 A를 Overlap하도록 설정했다면 최종 결과는 Overlap이 됩니다. 양쪽 모두가 서로를 Block해야만 물리적 충돌이 발생합니다.
3.2. 단순 콜리전 vs 복합 콜리전 (Simple vs Complex Collision)
- 단순 콜리전 (Simple Collision): 박스, 스피어, 캡슐 같은 간단한 프리미티브 도형들을 조합하여 오브젝트의 충돌 형태를 근사적으로 표현합니다. 물리 시뮬레이션(Physics Simulation)과 대부분의 게임플레이 상호작용에 사용됩니다. 연산 비용이 훨씬 저렴하여 퍼포먼스에 유리합니다.
- 복합 콜리전 (Complex Collision): 스태틱 메시의 실제 렌더링 지오메트리(모든 트라이앵글)를 그대로 콜리전 형태로 사용합니다. 매우 정밀한 충돌 감지가 필요할 때, 주로 라인 트레이스와 같은 씬 쿼리에서 사용됩니다. (예: 총알 궤적 판정).
Complex as Simple옵션을 사용하면 이 복합 콜리전을 물리 시뮬레이션에도 사용하도록 강제할 수 있지만, 퍼포먼스 비용이 매우 크기 때문에 특별한 경우가 아니면 권장되지 않습니다.
3.3. Chaos 물리 엔진에서의 처리
UE5의 기본 물리 엔진인 Chaos는 이러한 콜리전 필터링 규칙을 기반으로 물리 객체들의 상호작용을 시뮬레이션합니다. 콜리전 쿼리가 발생하면, Chaos는 Broad Phase(넓은 범위에서 충돌 가능성이 있는 후보들을 찾는 단계)에서 필터링 설정을 일부 활용하여 후보 쌍을 줄이고, Narrow Phase(실제로 정밀한 충돌 검사를 하는 단계)에서 최종적인 필터링 규칙(Ignore/Overlap/Block)을 적용하여 결과를 결정하고 필요한 이벤트를 생성합니다.
4. 계층 구조
4.1. 사용자 레벨 (Editor)
- 스태틱 메시 에디터: 단순/복합 콜리전 형태를 편집합니다.
- 블루프린트/레벨 에디터: 컴포넌트의 디테일 패널에서 콜리전 프리셋을 선택하거나, 각 채널에 대한 응답을 직접 수정합니다.
- 프로젝트 세팅: 커스텀 콜리전 채널과 프리셋을 정의합니다.
4.2. 코드 레벨 (C++ & Blueprints)
UPrimitiveComponent클래스와 그 자식 클래스들(e.g.,UStaticMeshComponent,UCapsuleComponent)에서 콜리전 관련 함수와 프로퍼티를 제공합니다.- 블루프린트 노드(
Set Collision Enabled,Set Collision Response to Channel등)나 C++ 함수를 통해 런타임에 콜리전 설정을 동적으로 변경할 수 있습니다.
4.3. 엔진 레벨 (Collision Manager)
FCollisionResponseParams,FCollisionQueryParams등의 구조체를 통해 콜리전 규칙과 쿼리 파라미터를 관리합니다.- 월드(
UWorld)는LineTraceSingleByChannel,OverlapMultiByObjectType등 다양한 씬 쿼리 함수를 제공하여 물리 엔진에 쿼리를 요청합니다.
4.4. 물리 엔진 레벨 (Chaos)
- Chaos 물리 씬(
FPhysScene_Chaos)이 실제 물리 객체(FChaosRigidBody)들을 관리합니다. - 엔진으로부터 쿼리 요청을 받으면, 내부적인 Broad Phase/Narrow Phase 알고리즘과 필터링 데이터를 사용하여 충돌/겹침을 감지하고 결과를 다시 엔진 레벨로 반환합니다.
5. 상세 비교
5.1. 오브젝트 채널 vs 트레이스 채널
| 구분 | 오브젝트 채널 (Object Channel) | 트레이스 채널 (Trace Channel) |
|---|---|---|
| 목적 | 오브젝트의 정체성/유형을 정의 | 씬 쿼리(트레이스)의 목적을 정의 |
| 주 사용처 | 물리 객체 간의 상호작용 응답 설정 | 라인 트레이스, 스윕, 오버랩 쿼리 |
| 설정 주체 | UPrimitiveComponent (오브젝트) |
UWorld의 쿼리 함수 (쿼리 요청) |
| 예시 | "나는 Pawn이다." |
"나는 Visibility를 확인하고 싶다." |
| 핵심 질문 | "이 오브젝트는 무엇인가?" | "이 쿼리는 무엇을 찾고 있는가?" |
5.2. 단순 콜리전 vs 복합 콜리전
| 구분 | 단순 콜리전 (Simple Collision) | 복합 콜리전 (Complex Collision) |
|---|---|---|
| 형태 | 박스, 스피어 등 프리미티브 도형 조합 | 메시의 실제 트라이앵글 지오메트리 |
| 정밀도 | 낮음 (근사치) | 높음 (픽셀 퍼펙트) |
| 퍼포먼스 | 높음 (비용 낮음) | 낮음 (비용 높음) |
| 주 사용처 | 물리 시뮬레이션, 캐릭터 이동, 일반적인 겹침 | 정밀한 라인 트레이스(총알), 복잡한 형태의 표면 감지 |
| 쿼리 타입 | Trace by Channel, Trace by Object |
Trace by Channel (복합 콜리전 옵션 활성화 시) |
5.3. Ignore vs Overlap vs Block
| 응답 | 물리적 충돌 | 이벤트 발생 | 주 사용 예시 |
|---|---|---|---|
| Ignore | 없음 | 없음 | 장식용 오브젝트, 유령 캐릭터 |
| Overlap | 없음 | Begin/End Overlap |
아이템 획득, 트리거 볼륨, 투사체(피해만 주고 통과) |
| Block | 발생 | Hit |
벽, 바닥, 플레이어 간 충돌, 물리적 장애물 |
6. C++를 이용한 콜리전 설정
UPrimitiveComponent에서 제공하는 함수들을 통해 C++ 코드에서 콜리전 속성을 직접 제어할 수 있습니다.
6.1. 콜리전 프로필 설정
가장 권장되는 방법으로, 에디터에서 정의한 프리셋을 이름으로 설정합니다.
// UPrimitiveComponent를 상속받는 컴포넌트에서 사용
MyComponent->SetCollisionProfileName(TEXT("Pawn"));
6.2. 개별 콜리전 응답 설정
특정 채널에 대한 응답만 동적으로 변경할 수 있습니다.
// 모든 채널에 대한 기본 응답을 Block으로 설정
MyComponent->SetCollisionResponseToAllChannels(ECR_Block);
// ECC_Pawn 채널에 대해서만 Overlap으로 특별히 설정
MyComponent->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
6.3. 콜리전 쿼리 (Collision Queries)
월드에 라인 트레이스나 스윕 같은 쿼리를 실행할 때, FCollisionQueryParams와 FCollisionObjectQueryParams를 사용하여 쿼리 동작을 세밀하게 제어합니다.
void AMyActor::PerformLineTrace()
{
FVector Start = GetActorLocation();
FVector End = Start + GetActorForwardVector() * 1000.f;
FHitResult HitResult;
// 쿼리 파라미터 설정: 자기 자신은 무시하고, 복합 콜리전을 사용하지 않음
FCollisionQueryParams QueryParams;
QueryParams.AddIgnoredActor(this);
QueryParams.bTraceComplex = false;
// 오브젝트 쿼리 파라미터 설정: WorldStatic과 Pawn 타입의 오브젝트만 대상으로 함
FCollisionObjectQueryParams ObjectQueryParams(ECC_WorldStatic | ECC_Pawn);
bool bHit = GetWorld()->LineTraceSingleByObjectType(
HitResult,
Start,
End,
ObjectQueryParams,
QueryParams
);
if (bHit)
{
// 무언가 맞았을 때의 로직
UE_LOG(LogTemp, Warning, TEXT("Hit Actor: %s"), *HitResult.GetActor()->GetName());
}
}
7. 요약
언리얼 엔진의 콜리전 필터링은 오브젝트 간의 상호작용을 제어하는 시스템입니다. 핵심은 콜리전 채널과 콜리전 응답입니다.
모든 콜리전 가능 오브젝트는 '나는 Pawn이다' 또는 '나는 WorldStatic이다'와 같이 자신의 정체성을 나타내는 오브젝트 채널을 가집니다. 그리고 다른 모든 종류의 오브젝트 채널에 대해 Ignore(무시), Overlap(겹침), Block(막힘) 중 하나의 콜리전 응답을 설정합니다.
두 오브젝트가 만나면, 엔진은 서로에 대해 설정된 응답을 비교하여 더 약한 쪽을 최종 상호작용으로 결정합니다. 예를 들어, 한쪽이 Block이고 다른 쪽이 Overlap이면 결과는 Overlap이 됩니다. 양쪽 모두 Block으로 설정해야만 물리적 충돌이 일어납니다. 또한, 라인 트레이스 같은 쿼리를 위해 트레이스 채널이 사용됩니다. 이는 'Visibility'나 'Weapon'처럼 쿼리의 목적을 정의하여, 해당 목적에 맞는 오브젝트만 감지하도록 필터링하는 데 쓰입니다.
이러한 설정들을 콜리전 프리셋으로 묶어서 재사용하고 관리의 일관성을 높일 수 있습니다. 이 시스템을 통해 복잡한 게임플레이 상호작용을 구현하고 성능을 최적화할 수 있습니다.
'Unreal' 카테고리의 다른 글
| 언리얼 엔진 가비지 컬렉션 (0) | 2025.11.17 |
|---|---|
| NetMode, NetConnection, NetDriver, NetRole (0) | 2025.11.14 |
| UE5 Delegate와 Event의 차이점 (0) | 2025.10.31 |
| UE5 Delegate (0) | 2025.10.31 |
| UE5 TSparseArray (0) | 2025.10.30 |
