본문 바로가기

기본 물리 엔진 설정

물리 시뮬레이션·충돌 이벤트·질량·댐핑의 기본 원리를 익히고 액터와 프로젝트에 물리 환경을 설정합니다.

조명과 날씨를 잘 꾸며도 물체가 아무 반응을 하지 않으면 레벨은 금방 인공적으로 보입니다. 문이 밀리고, 상자가 넘어지고, 물체끼리 부딪히는 순간부터 플레이어는 그 세계를 진짜처럼 받아들이기 시작합니다. 언리얼 엔진에서 이런 움직임을 계산하는 것이 물리 엔진(physics engine)이며, UE5의 기본 물리 시스템은 카오스(Chaos)입니다.

이 글에서는 물리 엔진이 게임에서 하는 일을 정리하고, 액터마다 물리를 켜고 질량과 감쇠를 정하는 설정, 스켈레탈 메시의 물리, 표면의 성질을 정하는 물리 재질, 프로젝트 전체의 물리 설정을 차례로 살펴봅니다. 마지막으로 큐브를 떨어뜨리며 각 설정을 직접 바꿔 보는 실습을 합니다. 어떤 액터에 물리를 켜야 하는지, 충돌 이벤트는 어디서 받는지, 무엇을 같게 두고 비교해야 하는지가 이 글의 핵심입니다.


물리 엔진이 하는 일

물리 엔진은 게임의 사실감과 플레이 경험에 깊은 영향을 줍니다. 물체가 중력에 의해 떨어지고, 부딪히면 튕겨 나가거나 부서지는 것처럼 실제와 비슷하게 반응하면 몰입감이 높아집니다. 또 물리를 이용한 퍼즐, 부서지는 환경, 차량 시뮬레이션처럼 여러 게임 플레이 요소를 만들 수 있습니다.

물리 시뮬레이션은 처음 상태와 계산 조건에 따라 결과가 조금씩 달라질 수 있어서, 게임에 예측하기 어려운 재미와 다시 플레이할 가치를 더합니다. 그리고 복잡한 움직임을 사람이 하나하나 애니메이션으로 만드는 대신, 물리 시뮬레이션으로 자연스러운 움직임을 얻을 수도 있습니다.


액터마다 정하는 물리 설정

언리얼 엔진의 물리는 액터의 컴포넌트에서 정하는 설정과, 프로젝트 전체에 적용되는 설정으로 나뉩니다. 먼저 액터 쪽부터 봅니다.

스태틱 메시 액터

레벨에 놓인 오브젝트의 대부분은 스태틱 메시 액터입니다. 물리로 움직일 메시 컴포넌트는 이동성을 Movable로 두고, 충돌 계산에 쓸 단순한 충돌 형상(simple collision)을 준비해 둡니다. 반대로 배경처럼 고정해 둘 대상에는 시뮬레이션을 켜지 않습니다.

물리를 켤 액터를 선택하면 디테일 패널의 Physics 항목에 다음과 같은 설정이 있습니다.

설정하는 일
Simulate Physics켜면 액터가 물리 엔진의 영향을 받아 중력에 떨어지고, 다른 물체와 부딪히면 반응하며 움직입니다.
Mass액터의 질량으로 단위는 kg입니다. 같은 힘을 받았을 때 질량이 클수록 가속도가 작습니다. 기본으로는 형상과 밀도로 계산되며, 직접 정하려면 Override Mass를 켭니다.
Enable Gravity물리 시뮬레이션이 켜졌을 때 중력의 영향을 받을지 정합니다. 기본으로 켜져 있습니다.
Linear Damping직선 운동에 저항하는 정도로, 값이 클수록 빨리 멈춥니다.
Angular Damping회전 운동에 저항하는 정도로, 값이 클수록 빨리 회전을 멈춥니다.
Use CCDPhysics 항목이 아니라 Collision 항목의 고급(Advanced) 설정에 있으며, 연속 충돌 감지(Continuous Collision Detection)를 켭니다. 아주 빠른 물체가 한 프레임 사이에 다른 물체를 뚫고 지나가는 터널링(tunneling)을 줄이지만 비용이 있으므로 꼭 필요할 때만 켭니다.

Collision 항목에도 물리와 관련된 설정이 있습니다. Collision Presets는 이 액터가 다른 물체와 어떻게 충돌할지를 미리 정해 둔 설정으로, 물리 기반 조정 (중력, 충돌)에서 자세히 다룹니다.

충돌을 이벤트로 받는 설정도 있습니다. Simulation Generates Hit Events는 물리 시뮬레이션 중에 막히는(blocking) 충돌이 일어났을 때 이 컴포넌트의 OnComponentHit 이벤트를 받고 싶을 때 켭니다. 예를 들어 물체가 땅에 닿을 때 소리를 내는 데 씁니다. 이것은 액터를 이동시키며 경로를 훑을 때(sweep) 생기는 Hit와는 다른 경로입니다. Generate Overlap Events는 영역에 들어가고 나가는 것을 OnComponentBeginOverlap과 OnComponentEndOverlap으로 받을 때 씁니다. 플레이어가 특정 영역에 들어오면 문이 열리게 하는 것이 그 예이며, 겹치는 두 컴포넌트 양쪽에서 이 설정을 켜고, 충돌 검사(query)가 켜져 있고, 서로의 채널 응답도 맞춰야 이벤트가 생깁니다.

스켈레탈 메시 액터

캐릭터나 애니메이션이 적용된 오브젝트인 스켈레탈 메시 액터는 스태틱 메시와 다른 방식으로 물리를 적용합니다. 스켈레탈 메시에는 피직스 에셋(Physics Asset)이라는 별도의 에셋이 연결되어 있는데, 이 에셋이 뼈대의 본마다 충돌 바디(collision body)와, 바디끼리 이어 주는 조인트(joint)를 정의합니다.

캐릭터가 쓰러지거나 특정 상황에서 몸이 축 늘어지며 물리로 무너지는 효과를 래그돌(ragdoll)이라고 부릅니다. 래그돌은 스켈레탈 메시 컴포넌트에 피직스 에셋을 지정하고, Physics 항목의 Simulate Physics를 켜서 만듭니다.

물리 재질

물리 재질(Physical Material)은 물체 표면의 마찰과 반발 같은 성질을 정해 물리 상호작용에 영향을 줍니다. 얼음은 마찰이 적고, 고무는 잘 튕기는 것처럼 표면마다 다르게 반응하게 할 수 있습니다. 콘텐츠 브라우저를 오른쪽 클릭하고 Physics에서 Physical Material을 골라 만듭니다.

주요 설정은 두 가지입니다. Friction은 다른 표면 위에서 얼마나 미끄러지는지를, Restitution은 부딪혔을 때 얼마나 튕겨 나가는지를 정합니다. 실제로 튕기는 정도는 부딪힌 두 표면의 값을 어떻게 합칠지 정하는 결합 방식(Combine Mode)과, 충돌 속도와 계산 조건에도 영향을 받습니다.

물리 재질을 적용하는 곳은 충돌 형상에 따라 다릅니다. 스태틱 메시의 단순 충돌에는 스태틱 메시 에디터의 디테일 패널에서 Physics 항목의 Simple Collision Physical Material에 지정합니다. 일반 재질의 Phys Material에 지정한 물리 재질은 주로 복잡한 충돌(complex collision)에서 표면 정보를 읽을 때 쓰입니다. 그래서 단순 충돌로 계산하는 물체라면 메시의 Simple Collision Physical Material이나 컴포넌트의 덮어쓰기 설정을 확인합니다. 물리 재질은 물리 재질 설정 및 최적화에서 더 자세히 다룹니다.


프로젝트 전체의 물리 설정

프로젝트 전체의 물리 동작은 Edit 메뉴의 Project Settings에서 Engine의 Physics 항목으로 정합니다. 앞 절의 설정이 액터 하나에만 적용된다면, 여기서 바꾼 값은 프로젝트의 모든 레벨에 기본값으로 적용됩니다. 그래서 물체 하나만 다르게 움직이게 하고 싶을 때는 이곳이 아니라 앞에서 본 액터별 설정을 고쳐야 합니다. 아래에서는 중력처럼 늘 쓰는 일반 설정과, 빠른 물체의 충돌을 안정시키는 서브스텝 설정을 살펴봅니다.

일반 설정

Default Gravity Z는 월드의 기본 중력이며, 기본값은 -980.0 cm/s²입니다. 언리얼의 길이 단위가 cm이므로, 지구의 중력 가속도 약 9.8 m/s²를 cm로 나타낸 값이고, 음수는 아래쪽을 뜻합니다. 이 값을 바꾸면 달이나 다른 행성의 중력을 흉내 낼 수 있습니다.

Max Physics Delta Time은 물리 계산의 한 단계가 진행할 수 있는 시뮬레이션 시간의 상한입니다. CPU가 물리 계산에 쓸 시간의 예산이 아니라는 점에 주의합니다. 이 값을 엔진의 한 프레임 시간보다 작게 제한하면, 안정성을 위해 물리가 실제 시간보다 느리게 진행될 수 있습니다.

Default Terminal Velocity는 기본 물리 볼륨에서 캐릭터 무브먼트(Character Movement)를 쓰는 Pawn이 떨어질 때의 최고 속도에 쓰입니다. 모든 카오스 강체에 공통으로 적용되는 최고 속도가 아닙니다. Default Phys Material은 물리 재질이 따로 지정되지 않은 모든 물체에 적용할 기본 물리 재질입니다.

서브스텝

Enable Substepping을 켜면 한 프레임의 물리 계산을 여러 개의 작은 단계(substep)로 나눠 계산합니다. 빠르게 움직이는 물체끼리의 충돌이 더 정확해지고 시뮬레이션이 안정되지만, 그만큼 비용이 늘 수 있습니다. 함께 쓰는 Max Substep Delta Time은 각 작은 단계의 최대 시간이고, Max Substeps는 한 프레임에 나눌 수 있는 최대 단계 수입니다.


큐브를 떨어뜨려 보기

간단한 레벨에서 물리 설정을 직접 바꿔 봅니다. File 메뉴의 New Level에서 Basic으로 레벨을 만들고, Cube 스태틱 메시를 몇 개 배치합니다.

물리 켜기

먼저 큐브 하나를 바닥과 겹치지 않게 위로 올려 떨어질 공간을 만듭니다. 큐브의 Mobility를 Movable로 두고, 메시 에디터에서 단순 충돌이 있는지 확인합니다. 그리고 바닥과 큐브 양쪽의 Collision Enabled가 켜져 있는지, 서로의 Object Type에 대해 Block으로 응답하는지 확인합니다. 바닥은 고정해 두고 큐브 하나만 시뮬레이션합니다.

그다음 그 큐브의 디테일 패널에서 Physics 항목의 Simulate Physics를 켜고 플레이 버튼을 누릅니다. 큐브가 중력에 의해 떨어져 바닥에 멈추면 물리가 동작한 것입니다.

질량과 감쇠 바꿔 보기

시뮬레이션을 켠 큐브에서 Override Mass를 켜고 질량을 1000.0처럼 크게, 또는 0.1처럼 작게 바꿔 봅니다. Linear Damping과 Angular Damping도 바꿔 가며 큐브의 움직임이 어떻게 달라지는지 봅니다.

질량을 비교할 때는 중력과 형상, 처음 속도, 감쇠를 모두 같게 두고 질량 하나만 바꿉니다. 이때 흔한 오해가 있습니다. 다른 힘 없이 같은 중력 가속도만 받아 떨어지는 자유 낙하에서는, 무거운 물체가 반드시 더 빨리 떨어지지 않습니다. 중력은 질량에 비례하는 힘을 주므로 가속도가 같아지기 때문입니다. 반면 같은 크기의 힘을 따로 가하는 비교에서는 질량이 클수록 가속도가 작아집니다. 두 비교를 구분하고, 실습이 끝나면 바꾼 중력과 감쇠의 값을 기록한 뒤 원래 기준으로 되돌립니다.

물리 재질 적용해 보기

콘텐츠 브라우저에서 새 물리 재질을 만들어 PM_Rubber라고 이름 붙이고, Restitution을 0.8처럼 높게 정합니다. 레벨에 큐브를 하나 더 놓고, 이 큐브의 Static Mesh 에셋을 더블클릭해 스태틱 메시 에디터를 연 뒤, 디테일 패널의 Physics 항목에서 Simple Collision Physical Material에 PM_Rubber를 지정합니다.

여기서 주의할 것은 에셋을 고친 것이라는 점입니다. 두 큐브가 같은 기본 Cube 에셋을 쓰고 있다면, 앞서 놓은 큐브에도 같은 설정이 적용됩니다. 한 큐브만 따로 비교하려면 에셋을 고치는 대신 그 컴포넌트의 Phys Material Override를 씁니다. 이 큐브에도 Simulate Physics를 켜고, 두 큐브를 같은 높이에서 떨어뜨려 PM_Rubber를 적용한 큐브가 더 잘 튕기는지 확인합니다.

프로젝트 중력 바꿔 보기

마지막으로 Project Settings의 Physics에서 Default Gravity Z를 -100.0(낮은 중력)이나 -2000.0(높은 중력)으로 바꾸고 다시 플레이해, 물체가 떨어지는 빠르기가 어떻게 바뀌는지 봅니다. 프로젝트 설정은 모든 레벨에 적용되므로, 확인이 끝나면 -980.0으로 되돌립니다.


정리

  • 물리 엔진은 중력과 충돌에 따른 움직임을 계산해 사실감과 게임 플레이를 만들며, UE5의 기본 물리 시스템은 카오스입니다.
  • 물리로 움직일 스태틱 메시는 Movable로 두고 단순 충돌을 준비한 뒤 Simulate Physics를 켜며, 질량은 kg이고 Override Mass로 직접 정합니다.
  • Simulation Generates Hit Events는 시뮬레이션 중의 막히는 충돌을 OnComponentHit로 받게 하고, 오버랩 이벤트는 양쪽에서 켜고 채널 응답도 맞춰야 생깁니다.
  • 스켈레탈 메시는 피직스 에셋의 바디와 조인트로 물리를 정하고, 래그돌은 피직스 에셋을 지정한 뒤 Simulate Physics를 켜서 만듭니다.
  • 물리 재질의 Friction과 Restitution이 표면의 성질을 정하며, 단순 충돌에는 메시의 Simple Collision Physical Material이나 컴포넌트 덮어쓰기를 씁니다.
  • 기본 중력은 -980.0 cm/s²이고, Max Physics Delta Time은 CPU 예산이 아니라 한 단계의 시뮬레이션 시간 상한입니다.
  • 질량을 비교할 때는 다른 조건을 같게 두며, 같은 중력만 받는 자유 낙하에서는 무거운 물체가 반드시 더 빨리 떨어지지 않습니다.

연습 문제

1. 무거운 상자가 더 빨리 떨어질까

같은 크기와 모양의 큐브 두 개를 같은 높이에서 동시에 떨어뜨립니다. 하나는 Override Mass로 1000 kg, 다른 하나는 1 kg으로 정했고, 감쇠는 둘 다 0이며 다른 힘은 없습니다. 어느 쪽이 먼저 바닥에 닿을까요? 두 큐브에 같은 크기의 힘으로 옆에서 밀면 어떻게 다를까요?

해설 보기

거의 동시에 닿습니다. 중력은 질량에 비례하는 힘을 주므로, 다른 힘이 없는 자유 낙하에서는 두 큐브의 가속도가 같습니다. 질량이 다르다고 떨어지는 빠르기가 달라지지 않습니다.

반면 같은 크기의 힘으로 옆에서 밀면, 가속도는 힘을 질량으로 나눈 값이므로 1 kg 큐브가 1000 kg 큐브보다 훨씬 크게 움직입니다. 그래서 질량을 비교할 때는 같은 중력으로 떨어지는 비교인지, 같은 힘을 가하는 비교인지 먼저 구분합니다.

2. 한 큐브만 튕기게 하려다

큐브 A만 잘 튕기게 하려고, A의 스태틱 메시 에셋을 열어 Simple Collision Physical Material에 PM_Rubber를 지정했습니다. 그런데 같은 Cube 에셋을 쓰는 큐브 B도 똑같이 튕기기 시작했습니다. 왜 그럴까요? A만 바꾸려면 어떻게 해야 할까요?

해설 보기

Simple Collision Physical Material은 스태틱 메시 에셋의 설정이라, 그 에셋을 쓰는 모든 배치에 함께 적용됩니다. A와 B가 같은 Cube 에셋을 쓰므로 둘 다 바뀌었습니다.

A만 바꾸려면 에셋은 그대로 두고, 레벨에 놓인 A의 메시 컴포넌트에서 Phys Material Override에 PM_Rubber를 지정합니다. 그러면 그 배치 하나에만 물리 재질이 덮어써집니다. 에셋과 배치의 차이는 1장에서 본 원본과 액터의 관계와 같습니다.

3. 들어가도 열리지 않는 문

트리거 영역에 플레이어가 들어오면 문이 열리도록 OnComponentBeginOverlap을 연결했습니다. 트리거 컴포넌트에서는 Generate Overlap Events를 켰는데, 플레이어가 들어가도 이벤트가 생기지 않습니다. 무엇을 확인해야 할까요?

해설 보기

오버랩 이벤트는 겹치는 두 컴포넌트 양쪽에서 Generate Overlap Events가 켜져 있어야 생깁니다. 그래서 먼저 플레이어 쪽 충돌 컴포넌트에서도 이 설정이 켜져 있는지 확인합니다.

그다음 두 컴포넌트의 충돌 검사(query)가 켜져 있는지, 그리고 서로의 Object Type에 대한 채널 응답이 Overlap으로 되어 있는지 확인합니다. 한쪽이라도 Ignore로 응답하면 겹쳐도 이벤트가 생기지 않습니다.

카오스 물리의 개요는 Epic의 물리 안내에서 확인할 수 있습니다.

다음 글 물리 기반 조정 (중력, 충돌)에서는 물체끼리 어떻게 반응할지를 정하는 충돌 채널과 프로필, 그리고 중력을 바꾸는 여러 방법을 더 깊이 다룹니다.