콜리전 시스템 기본 개념
콜리전 프리셋·채널·응답·메시 유형을 구분하고 Hit·Overlap 이벤트와 트레이스로 충돌을 처리합니다.
플레이어가 체력 포션에 닿았는데 아무 일도 일어나지 않거나, 반대로 포션이 벽처럼 플레이어를 막아서는 일은 블루프린트를 처음 만들 때 아주 흔합니다. 총알이 적을 그대로 통과하거나, 문이 플레이어를 감지하지 못하는 것도 대개 같은 원인입니다. 두 물체가 서로를 어떻게 대할지, 그리고 그 결과를 이벤트로 알릴지를 정하는 설정이 어긋난 것입니다.
앞 글에서 질량과 힘으로 물체를 움직였다면, 이 글에서는 물체끼리 부딪히는 방식을 정하는 콜리전(collision)을 다룹니다. 콜리전 프리셋, 채널과 응답, 콜리전 메시의 종류를 차례로 살펴보고, 충돌을 게임플레이 로직으로 잇는 Hit와 Overlap 이벤트, 그리고 물리 없이 충돌을 검사하는 트레이스를 익힙니다.
콜리전이 하는 일
콜리전은 게임 월드의 오브젝트끼리 부딪히는 것을 감지하고 반응하게 만드는 시스템입니다. 언리얼 엔진은 상자, 구, 캡슐 같은 기본 도형이나 볼록 형상으로 만든 단순 충돌(simple collision)과, 메시의 삼각형을 그대로 쓰는 복잡 충돌(complex collision)을 구분하며, 쿼리와 시뮬레이션에 필요한 정도에 맞춰 형상을 고릅니다. 엔진은 이 콜리전 형상끼리 교차하는지를 검사해 충돌을 판단하고, 튕기거나 멈추는 물리 반응을 일으키거나 On Hit, On Overlap 같은 이벤트를 냅니다.
콜리전이 필요한 이유는 세 가지입니다. 캐릭터가 벽에 부딪혀 멈추거나 총알이 물체에 맞아 튕기거나 부서지는 물리적 상호작용을 만들 수 있습니다. 플레이어가 아이템을 얻거나 적이 특정 영역에 들어왔을 때 이벤트를 일으키는 게임플레이 로직도 콜리전에서 시작합니다. 그리고 복잡한 실제 메시 대신 단순한 콜리전 메시로 계산하므로 충돌 검사의 비용이 줄어듭니다.
콜리전 프리셋으로 빠르게 정하기
언리얼 엔진에서 콜리전을 정하는 방법은 세 층으로 나뉩니다. 가장 쉬운 첫 층은 자주 쓰는 설정 조합을 미리 정의해 둔 콜리전 프리셋(collision preset)입니다. Static Mesh Component, Capsule Component, Box Component 같은 프리미티브 컴포넌트를 선택하고, 디테일 패널의 Collision 섹션에서 Collision Presets 드롭다운을 열어 고릅니다.
| 프리셋 | 설정 내용 | 주의할 점 |
|---|---|---|
No Collision | 어떤 충돌도 감지하지 않고 모든 것을 통과합니다. | |
OverlapAll | 기본 채널에 Overlap 응답을 설정합니다. | 실제 이벤트에는 상대의 응답, 쿼리 활성화, 양쪽의 Generate Overlap Events도 필요합니다. |
BlockAll | 기본 채널에 Block 응답을 설정합니다. | 상대도 이 오브젝트의 Object Type을 막아야 하며, 이 프리셋이 Simulate Physics를 켜지는 않습니다. |
PhysicsActor | 물리 오브젝트용 콜리전 설정입니다. | 실제 시뮬레이션과 중력은 따로 설정합니다. |
Pawn, CharacterMesh, Vehicle 등 | 캐릭터나 차량처럼 특정 종류의 오브젝트에 맞춘 표준 설정입니다. |
대부분의 경우 이 프리셋만으로 빠르게 콜리전을 정할 수 있습니다. 다만 표의 주의할 점처럼 프리셋은 응답을 정할 뿐이므로, 이벤트가 필요하다면 이벤트 설정을 따로 확인해야 합니다.
채널과 응답으로 세밀하게 정하기
프리셋으로 부족할 때는 두 번째 층으로 내려가, 이 컴포넌트가 어떤 종류의 오브젝트와 어떻게 상호작용할지 직접 정합니다. Collision Presets에서 Custom...을 고르면 세부 항목을 직접 설정할 수 있습니다.
Object Type은 이 컴포넌트가 어떤 종류의 오브젝트인지를 정의합니다. 움직이지 않는 월드인 WorldStatic, 움직이는 월드 오브젝트인 WorldDynamic, 그리고 Pawn, PhysicsBody, Vehicle, Destructible이 기본으로 제공됩니다. 직접 만든 종류가 필요하다면 Edit > Project Settings > Engine > Collision에서 New Object Channel로 Projectile, Explosion, Collectible 같은 채널을 추가하고, 그 채널이 기본적으로 어떻게 반응할지 Default Response로 정합니다.
응답은 두 묶음으로 나뉩니다. Trace Responses는 라인 트레이스, 박스 트레이스 같은 트레이스에 이 컴포넌트가 어떻게 반응할지를, Object Responses는 다른 Object Type들과 어떻게 상호작용할지를 정합니다. 어느 쪽이든 각 항목에 무시하는 Ignore, 겹침을 감지하는 Overlap, 막는 Block 가운데 하나를 고릅니다.
몇 가지 예를 보겠습니다. 플레이어끼리 통과하지 못하게 하려면 양쪽의 Pawn 응답을 Block으로 둡니다. 물론 통과하도록 설계할 수도 있습니다. 총알이 Projectile 채널이라면 WorldStatic은 Block해 벽에 막히고, Pawn은 Overlap해 피해를 주되 몸을 통과하게 할 수 있습니다. 아이템이 Collectible 채널이라면 Pawn에 Overlap으로 응답해 획득 이벤트를 일으킵니다.
OBJECT A ↔ OBJECT B
상대의 Object Type에 대한 양쪽 응답을 확인합니다
응답 조합은 상호작용 방식을, 이벤트 설정은 알림 여부를 결정합니다. 아래 조합은 필요한 Query 또는 Physics 충돌이 활성화된 경우를 전제로 합니다.
| 응답 조합 | 상호작용 | 이벤트 조건 |
|---|---|---|
| 한쪽이 Ignore | 상대가 Block/Overlap이어도 상호작용을 무시합니다. | 이 조합으로 Overlap 이벤트가 발생하지 않습니다. |
| 양쪽이 Block | 서로 막습니다. | 물리 충돌 알림은 Simulation Generates Hit Events를 확인합니다. Sweep Hit는 별도 이동 경로입니다. |
| Ignore 없이 Overlap 포함 | 한쪽이 Block이어도 막지 않고 겹칩니다. | Query를 허용하고 양쪽 Generate Overlap Events를 켭니다. |
- 응답 조합: 한쪽이 Ignore
- 상호작용: 상대가 Block/Overlap이어도 상호작용을 무시합니다.
- 이벤트 조건: 이 조합으로 Overlap 이벤트가 발생하지 않습니다.
- 응답 조합: 양쪽이 Block
- 상호작용: 서로 막습니다.
- 이벤트 조건: 물리 충돌 알림은 Simulation Generates Hit Events를 확인합니다. Sweep Hit는 별도 이동 경로입니다.
- 응답 조합: Ignore 없이 Overlap 포함
- 상호작용: 한쪽이 Block이어도 막지 않고 겹칩니다.
- 이벤트 조건: Query를 허용하고 양쪽 Generate Overlap Events를 켭니다.
프리셋 선택 뒤에도 이벤트 설정을 확인합니다
Block은 Simulate Physics나 Hit 알림을 자동으로 켜지 않습니다. Overlap 알림에는 양쪽의 Query와 Generate Overlap Events가 필요합니다. 고속 이동의 부수적인 Overlap 등은 별도로 필터링합니다.
위 그림은 두 컴포넌트 A와 B가 서로의 Object Type에 대해 가진 응답을 조합으로 읽는 표입니다. 응답 조합은 둘이 어떻게 상호작용할지를, 이벤트 설정은 그 결과를 알릴지를 정하며, 표는 필요한 쿼리나 물리 충돌이 켜져 있다는 전제에서 읽습니다. 한쪽이라도 Ignore라면 상대가 Block이나 Overlap이어도 상호작용을 무시하고, Overlap 이벤트도 생기지 않습니다. 양쪽이 모두 Block이면 서로 막으며, 이때 물리 충돌 알림을 받으려면 Simulation Generates Hit Events를 확인해야 하고 이동 중 스윕(sweep)에서 생기는 Hit는 별도의 경로입니다. Ignore 없이 Overlap이 하나라도 있으면, 한쪽이 Block이어도 막지 않고 겹치며, 알림을 받으려면 쿼리를 허용하고 양쪽의 Generate Overlap Events를 켜야 합니다.
그림 아래의 설명은 프리셋을 고른 뒤에도 이벤트 설정을 확인하라고 짚습니다. Block이 Simulate Physics나 Hit 알림을 자동으로 켜지 않고, Overlap 알림에는 양쪽의 쿼리와 Generate Overlap Events가 필요합니다. 또 빠르게 움직이는 물체에서 부수적으로 생기는 Overlap 같은 것은 따로 걸러야 합니다. 공식 문서도 막으려면 두 액터가 서로의 Object Type을 막도록 설정해야 하고, 한쪽이 Ignore이고 다른 쪽이 Overlap이면 Overlap 이벤트가 나지 않는다고 설명합니다.
아이템 상자와 플레이어 캡슐의 조합 읽기
이 표로 실제 조합 하나를 읽어 보겠습니다. 아이템의 Box를 Collision Enabled의 Query Only로 두고, Object Type을 WorldDynamic, Pawn 응답을 Overlap으로 설정합니다. 플레이어의 Capsule은 WorldDynamic에 Block으로 응답하지만, 양쪽 모두 Generate Overlap Events를 켰습니다. 두 물체가 처음에는 떨어져 있다가 플레이어가 Box 안으로 걸어 들어온다고 합시다.
이 조합에는 Ignore가 없고 한쪽이 Overlap이므로, 표의 세 번째 줄에 해당해 Box가 플레이어를 막지 않습니다. 양쪽의 쿼리와 이벤트 조건도 맞으므로 Box의 On Component Begin Overlap에서 Other Actor를 확인하는 경로가 실행될 것을 기대할 수 있습니다. 다만 아이템에 보이는 메시가 따로 있다면, 그 메시가 Block으로 설정되어 플레이어의 진입을 막고 있지 않은지도 확인합니다.
콜리전 메시의 종류 고르기
세 번째 층은 콜리전 형상 자체입니다. 스태틱 메시는 스태틱 메시 에디터에서 콜리전 메시의 모양을 정할 수 있으며, 이 선택이 물리의 정확도와 성능을 함께 바꿉니다. 콘텐츠 브라우저에서 스태틱 메시 에셋을 더블클릭해 에디터를 열고 Collision 메뉴를 보면 다음 항목이 있습니다.
Add Box Simplified Collision, Add Sphere Simplified Collision, Add Capsule Simplified Collision은 가장 간단한 기본 도형 콜리전을 추가하며 성능에 가장 유리합니다. K-DOP 계열의 단순 콜리전은 여러 경사면으로 메시를 감싸므로 상자보다 정확하면서도 여전히 가볍습니다. Auto Convex Collision은 메시의 모양을 따라가는 볼록 콜리전을 자동으로 만들며, 분해 설정에 따라 근사의 정확도와 비용이 달라집니다.
디테일 패널의 Collision Complexity에서 Use Complex Collision As Simple을 고르면, 단순 충돌을 요청할 때도 메시의 삼각형을 그대로 씁니다. 이렇게 설정한 오브젝트 자신은 물리 시뮬레이션을 할 수 없지만, 시뮬레이션 중인 다른 단순 바디와 부딪힐 수는 있습니다. 화면의 픽셀 하나하나와 같은 판정이 되는 것은 아니며, 움직이는 물리 바디에는 알맞은 단순 또는 볼록 콜리전을 만들어 줍니다. 정밀한 쿼리만 필요하다면 기본 단순, 복잡 형상을 그대로 두고 트레이스에서 Trace Complex를 고르는 방법도 있습니다. 설정한 콜리전 메시는 에디터의 Show Simple Collision을 켜서 눈으로 확인합니다.
Hit와 Overlap 이벤트로 로직 잇기
콜리전이 감지되면 언리얼 엔진은 이벤트를 내고, 블루프린트는 그 이벤트에 로직을 연결합니다. 어느 이벤트가 오는지는 앞에서 정한 응답이 정합니다. 서로 막는 Block 응답은 Hit 이벤트를, 막지 않고 겹치게 두는 Overlap 응답은 Overlap 이벤트를 냅니다. 다만 응답만 맞춰서는 이벤트가 오지 않을 수 있으므로, 아래에서는 이벤트마다 따로 켜야 하는 옵션과 이벤트가 넘겨주는 핀을 함께 봅니다.
Block 응답에서 오는 On Hit
On Hit 계열 이벤트는 다른 오브젝트에 Block으로 응답하는 충돌이 일어났을 때 실행되며, 주로 물리적 충돌과 관련된 로직에 씁니다. 물리 시뮬레이션의 충돌 알림을 받으려면 Simulation Generates Hit Events와 Block 응답을 확인합니다. 공식 문서에 따르면 이 옵션은 Hit 이벤트를 받을 쪽 오브젝트에서 켜야 하며, 상대도 이벤트를 받으려면 상대 쪽에서도 켜야 합니다. 캐릭터가 이동하며 스윕할 때 생기는 Hit는 물리 시뮬레이션 알림과 경로가 다르다는 점도 알아 둡니다.
이벤트는 컴포넌트를 선택한 상태에서 디테일 패널 아래쪽 Events 섹션의 On Component Hit 옆 + 버튼으로 만듭니다. 주요 핀은 세 가지입니다. Other Comp는 부딪힌 상대 컴포넌트이고, Normal Impulse는 물리 충돌의 충격량이며 스윕에서 생긴 Block Hit에서는 0일 수 있습니다. Hit는 구조체이므로 Break Hit Result로 풀어 Impact Point와 Impact Normal 같은 접촉 정보를 읽습니다. 총알이 벽에 맞으면 파편 이펙트와 소리를 재생하거나, 낙하한 캐릭터가 땅에 닿을 때 착지 애니메이션을 재생하거나, 부술 수 있는 물체가 충분한 힘으로 부딪혔을 때 파괴하는 데 씁니다.
Overlap 응답에서 오는 On Overlap
On Overlap 계열 이벤트는 Overlap으로 응답하는 충돌이 일어났을 때 실행되며, 트리거 영역이나 아이템 줍기처럼 물리적으로 막지 않고 상호작용만 필요할 때 씁니다. 양쪽 컴포넌트의 쿼리와 Generate Overlap Events를 켜고, 원하는 상대 Object Type에 Overlap 응답을 설정합니다. 한쪽이 Ignore하면 이벤트가 나지 않습니다.
이벤트는 Events 섹션에서 겹치기 시작할 때의 On Component Begin Overlap과 겹침이 끝날 때의 On Component End Overlap 옆 + 버튼으로 만듭니다. 주요 핀은 겹친 상대 액터인 Other Actor와 상대 컴포넌트인 Other Comp입니다. 플레이어가 체력 포션에 닿으면 획득하고 포션 액터를 파괴하거나, 플레이어가 특정 영역에 들어오면 퀘스트 목표를 갱신하거나, 적이 감시 구역에 들어오면 경고 상태로 바꾸는 데 씁니다.
트레이스로 충돌을 묻기
트레이스(trace)는 한 지점에서 특정 방향으로 선이나 도형을 쏘아, 그 경로에 콜리전이 있는지 묻는 쿼리입니다. 물리 시뮬레이션 없이도 충돌을 검사할 수 있어 쓰임새가 넓습니다.
Line Trace By Channel은 한 지점에서 다른 지점까지 선을 긋고, 지정한 트레이스 채널을 막는 첫 번째 Block Hit를 찾습니다. 총알의 명중 판정이나 시야 검사에 씁니다. Multi Line Trace By Channel은 처음 만나는 Block Hit까지의 Overlap 결과와 그 Block Hit를 함께 돌려주며, 벽 뒤에 있는 대상까지 모두 돌려주지는 않습니다. Box Trace By Channel, Sphere Trace By Channel, Capsule Trace By Channel은 선 대신 도형을 쏘므로 근접 공격의 범위 판정처럼 굵기가 있는 검사에 알맞습니다.
예를 들어 총구에서 쏜 라인 트레이스가 적 캐릭터에 막히면 피해를 적용하고, AI의 눈에서 플레이어까지 라인 트레이스를 쏘아 시야가 가려졌는지 확인하고, 플레이어 앞쪽으로 라인 트레이스를 쏘아 문이나 스위치 같은 상호작용 대상을 찾습니다. 트레이스는 다음 글에서 더 자세히 다룹니다.
콜리전 디버깅
콜리전이 기대대로 동작하지 않으면 먼저 형상을 봅니다. 에디터의 Collision 보기나 실행 중의 show collision 명령으로 형상을 표시하며, 이 명령은 선택한 오브젝트만이 아니라 화면의 콜리전을 모두 보여 줍니다. pxvis 명령은 UE4의 PhysX용이므로, UE5의 Chaos에서는 Chaos Visual Debugger 같은 도구를 씁니다. 에디터에서 P 키로 표시하는 초록색 영역은 내비메시(NavMesh)이지 콜리전 형상이 아니라는 점도 헷갈리지 않습니다. 트레이스는 Line Trace 같은 노드의 Draw Debug Type 핀을 For Duration이나 For One Frame으로 바꾸면 화면에 선으로 그려집니다.
정리
- 콜리전은 오브젝트끼리의 충돌을 감지하고 막거나, 겹치거나, 무시하게 만드는 시스템이며, 단순 충돌과 복잡 충돌을 구분합니다.
- 프리셋은 응답 조합을 빠르게 고르는 방법이고,
Custom에서는Object Type과Trace Responses,Object Responses를 직접 정합니다. - 한쪽이라도 Ignore이면 상호작용이 없고, 양쪽이 Block이면 막으며, Ignore 없이 Overlap이 하나라도 있으면 겹칩니다.
On Hit는 Block 응답과Simulation Generates Hit Events가,On Overlap은 양쪽의 쿼리와Generate Overlap Events가 있어야 받습니다.- 트레이스는 물리 없이 경로의 충돌을 묻는 쿼리이며,
Draw Debug Type으로 화면에 확인합니다.
연습 문제
1. 응답 하나와 이벤트 설정 하나만 바꾸기
본문의 아이템 상자와 플레이어 캡슐 조합에서, 아이템 Box의 Pawn 응답만 Ignore로 바꿨습니다. 캡슐의 Block은 그대로이니 획득 Overlap이 유지될까요? 다시 Overlap으로 돌리고 이번에는 Box의 Generate Overlap Events만 껐다면, 플레이어가 통과하는 것과 획득 알림이 오는 것을 같은 결과로 봐도 될까요? 두 경우 모두 처음의 떨어진 상태에서 새로 들어온다고 가정합니다.
해설 보기
첫 경우에는 획득 Overlap이 사라집니다. 한쪽이 Ignore이면 상대가 Block이어도 이 조합으로 Overlap을 만들 수 없기 때문입니다.
두 번째 경우는 응답이 Overlap이므로 서로 막지는 않아서 플레이어는 상자를 통과합니다. 하지만 Box의 이벤트 생성을 껐으므로 원하는 Begin Overlap 알림은 기대할 수 없습니다. 통과하느냐와 알림이 오느냐는 서로 다른 판단입니다. 실제로 확인할 때는 어느 컴포넌트의 이벤트인지, 양쪽의 쿼리, 응답, 이벤트 생성 설정과 Other Actor를 함께 봅니다.
2. 벽을 통과하는 총알
총알 액터의 콜리전을 Projectile 채널로 만들고 WorldStatic에 Block으로 응답하게 했는데, 총알이 벽을 그대로 통과합니다. 벽은 기본 BlockAll이 아니라 직접 만든 Custom 설정입니다. 무엇을 먼저 확인해야 할까요?
해설 보기
막으려면 양쪽 모두가 서로의 Object Type을 막아야 하므로, 벽의 Object Responses에서 Projectile 채널에 대한 응답이 Block인지부터 확인합니다. 새로 만든 채널은 Default Response를 따르므로, 그 값이 Overlap이나 Ignore였다면 벽이 총알을 막지 않습니다.
그다음 벽의 Collision Enabled가 충돌을 허용하는지, 벽 메시에 콜리전 형상이 실제로 있는지를 show collision으로 확인합니다. 총알이 아주 빠르다면 한 프레임에 벽을 건너뛰는 문제일 수도 있으므로, 이동 중 스윕이나 트레이스로 판정하는 방법을 검토합니다.
3. Hit 이벤트가 오지 않는 상자
물리 시뮬레이션 중인 상자가 바닥에 떨어져 멈추는 것은 보이는데, 상자의 On Component Hit에 연결한 Print String이 실행되지 않습니다. 무엇이 빠졌을까요?
해설 보기
상자가 바닥에 막혀 멈춘다는 것은 둘 다 Block으로 응답하고 있다는 뜻이므로 응답 조합은 맞습니다. 빠진 것은 알림 설정으로, 물리 시뮬레이션의 충돌에서 Hit 이벤트를 받으려면 상자 컴포넌트의 Simulation Generates Hit Events를 켜야 합니다.
Block 응답은 서로 막게 할 뿐 Hit 알림을 자동으로 켜지 않습니다. 이 옵션은 이벤트를 받을 쪽에서 켜야 하므로, 바닥 쪽에서 Hit 이벤트를 받고 싶다면 바닥 컴포넌트에도 따로 켭니다.
응답 조합과 이벤트가 생기는 조건은 언리얼 엔진 공식 문서의 콜리전 개요에서 확인할 수 있습니다.
다음 글 환경 쿼리와 트레이싱 기본 활용에서는 라인 트레이스와 도형 트레이스를 직접 쏘아 결과를 읽고, 상호작용 대상과 지면을 찾는 데 활용하는 방법을 살펴봅니다.