물리 기반 조정 (중력, 충돌)
전역·액터 중력을 조정하고 Block·Overlap·Ignore 충돌 응답과 고속 이동의 연속 충돌 검사를 설정합니다.
중력과 충돌은 물리 시스템에서 가장 먼저 체감되는 설정입니다.
값 하나만 잘못 잡아도 캐릭터가 떠다니거나, 오브젝트가 벽을 뚫거나, 전투 감각이 쉽게 무너질 수 있습니다.
이번 절에서는 중력(Gravity)과 충돌(Collision)을 프로젝트 전역 설정과 액터 개별 설정으로 나눠 조정하는 방법을 다룹니다.
Block / Overlap / Ignore를 언제 선택해야 하는지, 고속 이동에서 터널링을 줄이려면 어떤 옵션을 써야 하는지도 함께 정리하겠습니다.
이 절을 마치면 물리 반응을 감이 아니라 기준으로 튜닝할 수 있습니다.
중력 (Gravity)의 이해와 조정
중력은 모든 물리 시뮬레이션의 기본이며, 오브젝트가 자연스럽게 아래로 떨어지도록 만듭니다.
언리얼 엔진은 프로젝트 전체에 적용되는 기본 중력 외에도, 특정 액터의 중력을 개별적으로 제어할 수 있는 유연성을 제공합니다.
프로젝트 기본 중력 조정
- 위치:
편집(Edit) > 프로젝트 세팅(Project Settings) > 엔진(Engine) > 물리(Physics) - 설정:
Default Gravity Z (기본 중력 Z)- 기본값:
-980.0(cm/s²). 이는 지구의 표준 중력과 거의 유사합니다. -
조정
- 값을 낮추면 (절댓값 기준, 예:
-100.0): 오브젝트가 더 천천히 떨어지며, 마치 달이나 우주 환경처럼 느껴집니다. 같은 초기 점프 속도라면 체공 시간과 높이가 증가할 수 있습니다. - 값을 높이면 (절댓값 기준, 예:
-2000.0): 오브젝트가 더 빠르게 떨어지며, 높은 중력의 행성처럼 느껴집니다. 같은 초기 점프 속도라면 높이와 체공 시간이 줄어듭니다.
- 값을 낮추면 (절댓값 기준, 예:
- 활용: 게임의 전체적인 분위기나 특정 레벨의 테마(예: 저중력 행성)를 설정할 때 사용합니다.
- 기본값:
액터별 중력 활성화/비활성화 및 배율 조정
- 액터 선택: 레벨에 있는 물리 시뮬레이션이 활성화된
Static Mesh Actor또는Skeletal Mesh Actor선택 -
디테일 패널 > Physics (물리) 섹션
Enable Gravity (중력 활성화): 이 옵션을 비활성화하면 해당 액터는 물리 시뮬레이션이 활성화되어 있어도 중력의 영향을 받지 않고 기존 속도·감쇠·충돌·외력이 계속 적용됩니다. 중력을 끈다고 현재 위치에 고정되지는 않습니다.- 활용: 우주선, 무중력 상태의 오브젝트, 또는 플레이어가 수동으로 움직이는 플랫폼 등에 사용합니다.
일반 메시 강체의 Physics에 공통 Gravity Scale 속성이 있는 것은 아닙니다. 캐릭터는 Character Movement의 Gravity Scale을 사용합니다. 강체의 개별 중력 배율은 별도 힘 적용 등으로 구현해야 합니다.
충돌 (Collision)의 이해와 조정
중력과 충돌 조정은 숫자를 바꾸는 것보다 어떤 액터가 어떤 규칙을 따르는지 구분하는 일이 먼저입니다.
두 컴포넌트가 상대 Object Type에 정한 응답을 함께 비교합니다. 다음 표는 충돌이 활성화된 경우의 기본 조합이며, 이벤트 발생 조건은 아래에서 따로 확인합니다.
충돌 활성화를 전제로 양쪽 Object Type에 대한 응답을 비교한다. 응답 조합은 이벤트 생성 옵션과 별개다.
| 한쪽 응답 | 상대 응답 | 기본 결과 |
|---|---|---|
| Ignore | 어떤 응답이든 | 이 쌍의 충돌·겹침을 무시 |
| Overlap | Overlap 또는 Block | 차단하지 않고 겹침 감지 |
| Block | Block | 이동을 차단 |
- Ignore + 어떤 응답이든
- 이 쌍의 충돌·겹침을 무시
- Overlap + Overlap 또는 Block
- 차단하지 않고 겹침 감지
- Block + Block
- 이동을 차단
충돌은 오브젝트들이 서로 물리적으로 부딪히는 방식을 정의하며, 게임 플레이의 정확성과 현실성에 직접적인 영향을 미칩니다.
언리얼 엔진은 다양한 충돌 설정을 제공하여 세밀한 제어가 가능합니다.
충돌 프리셋 (Collision Presets)
- 역할: 오브젝트가 다른 오브젝트와 어떻게 상호작용할지 미리 정의된 규칙의 집합입니다.
- 위치:
Static Mesh Actor또는 다른 컴포넌트(예:Sphere Collision,Box Collision)의 디테일 패널 >Collision섹션 -
주요 프리셋
NoCollision (충돌 없음): 어떤 오브젝트와도 충돌하지 않고 뚫고 지나갑니다. (예: 배경 오브젝트, 시각 효과용 파티클)BlockAll (모두 차단): 기본 채널에 Block 응답을 설정합니다. 상대 응답과 Collision Enabled도 맞아야 실제로 차단됩니다. (예: 벽, 바닥, 단단한 지형)OverlapAll (모두 오버랩): 기본 채널에 Overlap 응답을 설정합니다. 양쪽의 이벤트 생성 조건을 만족해야 알림이 발생합니다. (예: 트리거 볼륨, 상호작용 가능한 영역)PhysicsActor: 물리 시뮬레이션이 활성화된 오브젝트에 적합한 프리셋입니다. 플레이어, 월드 다이내믹 등 대부분의 요소를 차단합니다.Pawn: 플레이어 캐릭터(Pawn)에 적합한 프리셋입니다.CharacterMesh: 플레이어 캐릭터의 스켈레탈 메시(몸)에 적합한 프리셋입니다.
- 활용: 대부분의 경우 이 미리 정의된 프리셋으로 충분합니다.
커스텀 충돌 설정 (Custom Collision)
- 필요성: 특정 오브젝트가 특정 종류의 오브젝트하고만 충돌하거나, 특정 종류의 오브젝트하고만 겹침 이벤트를 발생시키고 싶을 때 사용합니다.
- 설정 방법:
Collision Presets드롭다운에서Custom...을 선택합니다. -
채널 (Collision Channels)
Object Type (오브젝트 타입): 이 오브젝트가 어떤 종류인지 정의합니다. (예:WorldStatic,WorldDynamic,Pawn,PhysicsBody등)Response (반응): 이 오브젝트가 다른Object Type에 대해 어떤 반응을 보일지 정의합니다.Ignore (무시): 충돌하지 않고 뚫고 지나갑니다.Overlap (오버랩): 물리적으로 차단하지 않고 겹침 감지에 참여합니다. 이벤트 생성은 별도 조건입니다.Block (차단): 상대도 Block이면 이동을 막습니다. Hit 알림은 시뮬레이션/이동 방식과 이벤트 설정에 따릅니다.
-
활용 예시
- 총알:
Object Type을Projectile로 설정하고,Pawn은Block,WorldStatic은Block,PhysicsBody는Block,Pickup(아이템)은Overlap으로 설정할 수 있습니다. - 유령 캐릭터:
Object Type을Ghost로 설정하고, 모든 오브젝트 타입에 대해Overlap으로 설정하여 물리적으로 뚫고 지나가지만, 겹침 이벤트를 통해 상호작용은 가능하게 만들 수 있습니다.
- 총알:
Projectile, Pickup, Ghost는 이 예시에서 프로젝트에 추가할 사용자 정의 Object Channel 이름입니다.
커스텀 채널을 설계할 때는 Object Type별 반응과 이벤트를 함께 고정해 두면, 레벨마다 충돌 규칙이 어긋나는 문제를 줄일 수 있습니다.
충돌 메시 및 복잡도
-
Simple Collision (단순 충돌)
- 역할: 오브젝트의 외형을 단순화한 형태(상자, 구, 캡슐, 또는 Convex Hull)로 충돌을 계산합니다.
- 장점: 성능이 매우 효율적입니다. 대부분의 게임 오브젝트에 사용됩니다.
- 확인:
Static Mesh Editor에서 툴바의Collision메뉴를 통해Add Box/Sphere/Capsule Simplified Collision등을 추가하거나,Auto Convex Collision을 사용하여 자동으로 단순화된 충돌 메시를 생성할 수 있습니다.
-
Complex Collision (복잡 충돌)
- 역할: 메시의 실제 지오메트리(폴리곤)를 그대로 사용하여 충돌을 계산합니다.
- 장점: 매우 정확한 충돌을 제공합니다.
- 단점: 성능 부하가 매우 큽니다.
- 설정:
Static Mesh Editor의Details패널 >Collision섹션 >Collision Complexity의Simple And Complex에서는 쿼리의 단순/복잡 요청을 구분합니다.Use Complex as Simple은 단순 요청도 삼각형 메시로 처리하는 별도 선택이며, 그 메시 자체는 물리 시뮬레이션할 수 없습니다. - 활용: 아주 정밀한 충돌이 필요한 특정 상황(예: 복잡한 지형의 좁은 통로, 총알이 정확히 구멍에 들어가야 하는 경우)에만 제한적으로 사용합니다. 캐릭터는 캡슐로 이동하지만, 부딪힐 정적 환경에 복잡 충돌을 사용할지는 필요한 형상 정확도와 비용으로 결정합니다.
Hit Events와 Overlap Events
-
Simulation Generates Hit Events- 물리 시뮬레이션 접촉의 Hit를 받을 컴포넌트에서 켭니다. 일반 blocking 접촉과 알림을 구분하며, 캐릭터 이동이나 sweep 이동에서도
OnComponentHit가 발생할 수 있습니다. - 활용: 총알이 벽에 맞았을 때, 상자가 바닥에 떨어졌을 때, 차량이 다른 차량과 충돌했을 때 등.
- 물리 시뮬레이션 접촉의 Hit를 받을 컴포넌트에서 켭니다. 일반 blocking 접촉과 알림을 구분하며, 캐릭터 이동이나 sweep 이동에서도
-
Generate Overlap Events (오버랩 이벤트 생성)- 양쪽 컴포넌트의
Generate Overlap Events, query 충돌 활성화와 채널 응답을 함께 맞춥니다. 실제 겹침 시작/끝에OnComponentBeginOverlap,OnComponentEndOverlap을 받습니다. - 활용: 플레이어가 트리거 영역에 진입했을 때, 아이템을 주웠을 때, 특정 지역에 들어서면 사운드가 재생될 때 등.
- 양쪽 컴포넌트의
물리 기반 조정 실습
간단한 예시를 통해 중력과 충돌 설정을 직접 조정해 봅시다.
새로운 레벨 생성: 파일(File) > 새 레벨(New Level) > 기본(Basic)을 선택합니다.
프로젝트 세팅(Project Settings) > 물리(Physics)로 이동하여Default Gravity Z값을-200.0으로 변경합니다.- 레벨에
Cube를 배치하고Simulate Physics를 활성화합니다. 게임을 플레이하여 큐브가 느리게 떨어지는 것을 확인합니다. - 큐브의
Enable Gravity를 끈 경우와 켠 경우를 비교합니다. 배율 실습은 플레이어 캐릭터의Character Movement > Gravity Scale을1.0과5.0으로 바꾸어 같은 초기 점프 조건에서 비교합니다.
- 레벨에
Cube를 하나 배치하고Collision Presets를OverlapAll로 변경합니다. (이때Simulate Physics는 비활성화된 상태가 더 좋습니다.) - 큐브와 플레이어 캡슐 양쪽의
Generate Overlap Events를 활성화하고 상대 채널이 Ignore가 아닌지 확인합니다. - 큐브를 가진 Actor Blueprint에서 메시 컴포넌트의
OnComponentBeginOverlap이벤트를 추가하고,Other Actor를 플레이어 클래스로 필터링합니다. - 이벤트 그래프에서
OnComponentBeginOverlap노드에Print String노드를 연결하고 Player Entered!와 같은 메시지를 입력합니다. - 게임 플레이 모드에서 플레이어 캐릭터로 해당 큐브를 뚫고 지나가면 화면에 메시지가 출력되는 것을 확인합니다.
- 팁: 큐브가 너무 작아 캐릭터가 잘 겹치지 않으면 큐브의 스케일을 키우거나,
Box Collision컴포넌트를 추가하여 충돌 볼륨만 키울 수 있습니다.
- 레벨에
SM_Chair와 같은 비교적 복잡한 스태틱 메시를 배치합니다. - 뷰포트의
Show > Collision으로 충돌을 표시합니다. 스태틱 메시 에디터의 Simple/Complex Collision 표시와 함께 확인하며 색만으로 종류를 단정하지 않습니다. - 해당 스태틱 메시 에셋을 더블클릭하여 스태틱 메시 에디터를 엽니다.
Simulate Physics를 끈 정적 비교 메시에서Collision Complexity를Use Complex as Simple로 바꾸고 캐릭터·단순 충돌 물체의 접촉 위치를 비교합니다. 표시 색이나 메시만으로 판정하지 말고 실제 접촉도 확인합니다.
물리 기반 조정은 중력, 충돌 프리셋, 커스텀 반응, 단순/복잡 충돌 메시를 나누어 설정하는 작업입니다.
게임플레이 요구와 성능 비용을 함께 확인해야 합니다.