물리 재질 설정 및 최적화
물리 재질의 마찰·반발·밀도를 조정하고 Surface Type을 사운드와 이펙트에 연결해 표면별 반응을 만듭니다.
모든 표면이 같은 마찰과 반발을 가지면 게임은 단조롭고 가짜처럼 느껴집니다. 얼음 위에서 미끄러지고, 고무 바닥에서 튕기고, 금속에 부딪히면 쨍 하는 소리가 나는 것처럼 표면마다 반응이 달라야 플레이의 감각이 살아납니다. 언리얼 엔진에서는 이 차이를 물리 재질(Physical Material)로 만듭니다.
이 글에서는 물리 재질이 담는 값인 마찰, 반발, 밀도, 표면 타입을 하나씩 살펴보고, 물리 재질을 메시와 재질, 액터에 적용하는 세 가지 방법과 그 적용 범위를 그림으로 비교합니다. 그다음 고무와 얼음, 모래의 물리 재질을 만들어 비교하고, 두 표면의 값이 어떻게 합쳐지는지 계산해 봅니다. 이 글을 마치면 물체의 겉모습뿐 아니라 실제 반응까지 설계할 수 있습니다.
물리 재질이 담는 것
물리 재질은 UE5의 기본 물리 시스템인 카오스(Chaos)가 물체끼리의 상호작용을 계산할 때 읽는 데이터 에셋입니다. 화면에 보이는 색과 질감을 정하는 일반 재질(Material)과는 별개로, 마찰과 반발, 밀도, 그리고 게임 플레이에서 쓸 표면 타입을 담습니다. 그래서 물리 재질을 바꿔도 물체의 색이나 질감은 저절로 바뀌지 않습니다.
물리 재질의 네 가지 역할은 다음과 같습니다. 마찰(Friction)은 물체가 다른 표면 위에서 얼마나 미끄러지는지를, 반발(Restitution)은 부딪혔을 때 얼마나 튕겨 나가는지를 정합니다. 밀도(Density)는 형상과 함께 질량을 계산하는 데 쓰입니다. 표면 타입(Surface Type)은 충돌했을 때 어떤 소리나 파티클 효과를 낼지 고르는 데 쓰는 값으로, 금속에 부딪히는 소리와 나무에 부딪히는 소리를 구분하는 데 씁니다.
물리 재질 만들기
콘텐츠 브라우저를 오른쪽 클릭하고 Physics에서 Physical Material을 골라 만듭니다. 이름에는 PM_ 접두사를 붙여 PM_Wood, PM_Metal, PM_Rubber, PM_Ice처럼 짓습니다. 만든 에셋을 더블클릭하면 물리 재질 에디터가 열립니다.
마찰과 반발
Friction은 이 재질의 마찰 계수입니다. 0.0이면 이 재질의 마찰 계수가 0이라는 뜻이고, 1.0은 마찰 계수 1의 예시일 뿐 모든 일반 표면의 표준값은 아닙니다. 1.0보다 크면 고무처럼 끈적이는 높은 마찰이 됩니다. 다만 두 물체가 맞닿을 때 실제로 쓰이는 마찰은 이 재질 하나의 값이 아니라, 상대 재질의 값과 둘을 합치는 결합 방식(Combine Mode)으로 정해집니다. 결합 방식에는 평균(Average), 최솟값(Min), 최댓값(Max), 곱(Multiply)이 있습니다.
Restitution은 반발 계수입니다. 0.0이면 점토처럼 충격을 흡수해 튕기지 않고, 1.0은 반발 계수의 높은 쪽 값입니다. 하지만 상대 재질과 결합 방식, 물리 계산의 조건 때문에 실제로 튕겨 오르는 높이가 늘 같지는 않습니다. 반발에도 마찰처럼 결합 방식이 있습니다.
Override Friction Combine Mode와 Override Restitution Combine Mode는 마찰이나 반발 계수를 쓸지 말지를 정하는 옵션이 아니라, 두 표면의 값을 합치는 방식을 이 재질에서 따로 지정하는 옵션입니다.
밀도
Density의 단위는 g/cm³입니다. 예를 들어 1.0은 물의 밀도와 비슷한 값이고, 값이 클수록 같은 부피에서 질량이 커집니다. 납은 높게, 스티로폼은 낮게 정하는 식입니다. 엔진은 이 밀도와 물체의 형상으로 질량을 계산하는데, 질량을 직접 덮어쓰는 Override Mass를 켜지 않았을 때 이 계산이 쓰입니다. 큰 물체의 질량이 부피에 비례해 지나치게 커지지 않도록 조절하는 Raise Mass To Power 값도 함께 확인합니다.
표면 타입
Surface Type에서는 Project Settings의 Physics에 있는 Physical Surface 목록에서 미리 정의해 둔 표면 타입을 고릅니다. 이 값은 효과를 고르기 위한 데이터일 뿐이라, 지정하는 것만으로 소리나 효과가 저절로 재생되지는 않습니다. 실제로 쓰려면 성공한 충돌이나 트레이스의 Hit Result를 Break Hit Result로 풀어 Phys Mat 핀에서 물리 재질을 읽고, Get Surface Type으로 표면 타입을 얻은 뒤 Switch on EPhysicalSurface로 소리와 효과를 고릅니다. 이때 트레이스나 이동의 훑기(sweep)가 물리 재질을 돌려주도록 설정되어 있는지도 확인합니다.
물리 재질을 적용하는 세 곳
물리 재질은 스태틱 메시 에셋, 일반 재질 에셋, 레벨에 놓인 액터의 컴포넌트에 적용할 수 있고, 어디에 적용하느냐에 따라 영향을 주는 범위가 다릅니다. 에셋에 지정하면 그 에셋을 쓰는 모든 배치가 같은 값을 공유하고, 컴포넌트에 지정하면 그 배치 하나만 바뀝니다. 또 같은 물체라도 충돌을 단순 충돌로 계산하는지 복잡 충돌로 계산하는지에 따라 읽히는 경로가 다릅니다. 그래서 아래에서는 세 곳을 하나씩 본 뒤, 마지막에 그림으로 세 경로의 범위를 함께 비교합니다.
스태틱 메시 에셋
특정 스태틱 메시의 기본 물리 성질을 정할 때 가장 직접적인 방법입니다. 스태틱 메시 에셋을 더블클릭해 스태틱 메시 에디터를 열고, 디테일 패널의 Physics 항목에서 Simple Collision Physical Material에 만든 물리 재질을 지정합니다. 이 값은 그 메시의 단순 충돌에 쓰이는 기본값이라, 이 에셋을 쓰는 모든 배치가 함께 공유합니다. 다만 컴포넌트에서 따로 덮어쓴 배치는 예외입니다.
일반 재질 에셋
일반 재질 에셋을 더블클릭해 재질 에디터를 열고, 디테일 패널의 Physical Material 항목에서 Phys Material에 물리 재질을 지정할 수도 있습니다. 이렇게 하면 화면에 보이는 재질과 물리 성질을 함께 관리할 수 있어서, 복잡 충돌에서 표면마다 다른 성질을 줄 때 쓸모가 있습니다.
다만 메시 표면의 재질이나 재질 인스턴스에 지정하는 경로와, 단순 충돌에 쓰는 경로는 서로 다릅니다. 그래서 어느 쪽이 더 일반적인지를 따지기보다, 지금 쓰는 충돌과 트레이스가 단순(Simple)인지 복잡(Complex)인지를 먼저 확인합니다.
액터별 덮어쓰기
레벨에 놓인 특정 액터 하나에만 다른 물리 재질을 주고 싶다면, 그 스태틱 메시 액터를 선택하고 메시 컴포넌트의 Phys Material Override에 원하는 물리 재질을 지정합니다. 이 설정은 그 배치의 단순 충돌에 쓰이는 물리 재질을 바꾸는 것입니다. 복잡 트레이스에서 읽는 모든 표면의 재질까지 무조건 덮어쓴다고 가정하지 말고, 실제 Hit Result로 확인합니다.
세 경로의 적용 범위
SIMPLE · INSTANCE OVERRIDE · COMPLEX
공유 메시 기본값과 개별 컴포넌트 오버라이드를 구분합니다
같은 Static Mesh를 쓰는 두 컴포넌트 A/B를 가정합니다. 아래 PM_Wood·PM_Ice는 적용 범위를 비교하기 위한 예시 이름입니다. 사용하는 충돌·Trace가 Simple인지 Complex인지 먼저 확인합니다.
메시 에셋 기본값은 여러 인스턴스에 영향을 줄 수 있습니다. A의 개별 Override는 공유 메시의 PM_Wood를 바꾸는 것이 아니며 B로 전파되지 않습니다. 단순 충돌용 Override가 복잡 Trace의 모든 표면까지 덮어쓴다고 가정하지 않고 실제 Hit Result의 Phys Material을 확인합니다.
세 화살표는 적용 범위를 비교하는 독립 관계입니다. Surface Type은 효과 선택용 데이터이며 사운드·이펙트가 자동 재생되지 않습니다. Character Movement의 Ground Friction도 별도로 연결합니다.
위 그림은 같은 스태틱 메시를 쓰는 두 컴포넌트 A와 B를 예로, 세 경로가 각각 어디까지 영향을 주는지 비교합니다. 그림의 PM_Wood와 PM_Ice는 범위를 비교하기 위한 예시 이름입니다. 맨 위에서 A는 컴포넌트의 Phys Material Override에 PM_Ice를 따로 지정했으므로, A의 단순 충돌은 PM_Ice를 씁니다. 가운데에서 공유 메시의 Simple Collision Physical Material(그림에서는 줄여서 Simple Physical Material로 적었습니다)은 PM_Wood이고, 덮어쓰기가 없는 B의 단순 충돌은 이 기본값인 PM_Wood를 씁니다. 맨 아래에서는 표면 재질이나 재질 인스턴스의 Phys Material 경로가 복잡 트레이스로 이어지며, 이 경우에는 그 표면의 경로를 확인하고 Hit Result가 돌려준 값을 직접 검증합니다.
그림의 설명이 짚듯이, 메시 에셋의 기본값은 여러 배치에 영향을 줄 수 있지만, A의 개별 덮어쓰기가 공유 메시의 PM_Wood를 바꾸지는 않으므로 B에게 전파되지 않습니다. 또 단순 충돌용 덮어쓰기가 복잡 트레이스의 모든 표면까지 덮어쓴다고 가정하지 않습니다. 세 화살표는 서로 독립된 관계이며, 표면 타입은 효과를 고르기 위한 데이터일 뿐 소리나 효과를 자동으로 재생하지 않고, 캐릭터 이동의 지면 마찰(Ground Friction)도 따로 연결해야 합니다.
고무, 얼음, 모래 비교해 보기
이제 여러 물리 재질을 만들어 적용하고 효과를 비교해 봅니다. File 메뉴의 New Level에서 Basic으로 레벨을 만들고, 콘텐츠 브라우저에 세 가지 물리 재질을 만듭니다. PM_Rubber는 Restitution 0.9와 Friction 0.5, PM_Ice는 Restitution 0.1과 Friction 0.05, PM_Sand는 Restitution 0.0과 Friction 0.8로 정합니다. 기본 물리 엔진 설정에서 PM_Rubber를 이미 만들었다면, 같은 이름으로 새로 만들지 말고 그 에셋을 열어 값만 이렇게 바꿉니다.
고무공
레벨에 Sphere 스태틱 메시를 놓고 디테일 패널의 Physics 항목에서 Simulate Physics를 켭니다. 그다음 Sphere 에셋을 더블클릭해 스태틱 메시 에디터를 열고, Physics 항목의 Simple Collision Physical Material에 PM_Rubber를 지정합니다. 플레이하면 구가 바닥에 떨어져 여러 번 튕기는 것을 볼 수 있습니다. 이 설정은 Sphere 에셋을 쓰는 모든 구에 적용된다는 점을 기억해 둡니다.
얼음 바닥
단순 충돌을 가진 바닥 메시 컴포넌트의 Phys Material Override에 PM_Ice를 지정합니다. 이때 캐릭터 무브먼트 컴포넌트의 Ground Friction은 표면의 Friction 값을 자동으로 가져오지 않는다는 점에 주의합니다. 그래서 먼저 같은 처음 속도로 미끄러지는 시뮬레이션 큐브로 비교하고, 캐릭터가 미끄러지는 느낌은 물리 기반 캐릭터 제어에서 따로 연결합니다.
모래 상자
새 Cube를 레벨에 놓고 Simulate Physics를 켠 뒤, 이 큐브 컴포넌트의 Phys Material Override에 PM_Sand를 지정합니다. 화면에서 모래처럼 보이게 하려면 시각적인 재질 M_Sand를 따로 만들어 큐브에 적용해야 합니다. 물리 재질은 겉모습을 바꾸지 않기 때문입니다. 그다음 같은 높이와 바닥, 질량, 감쇠에서 고무공과 모래 상자를 떨어뜨려, 튕기는 정도와 멈추기까지의 시간을 비교합니다. 이때 바닥 재질의 계수와 결합 방식도 함께 기록합니다.
표면마다 다른 효과 내기
표면에 따라 소리나 효과를 다르게 내려면, 성공한 트레이스나 Hit에서 물리 재질을 읽은 뒤 표면 타입으로 효과를 고릅니다. 물리 재질이 없거나 Hit가 실패한 경우에 쓸 기본 효과도 정해 두면, 예상하지 못한 표면에서도 아무 소리가 나지 않는 일을 막을 수 있습니다.
두 표면의 값이 합쳐지는 방식
맞닿은 두 표면의 마찰 계수가 각각 0.05와 0.8이라고 해 봅시다. 이번 비교에서 평균(Average) 결합 방식이 실제로 선택되었다면, 결합한 값은 (0.05 + 0.8) ÷ 2 = 0.425입니다. 그래서 얼음 쪽 계수만 낮다고 해서 최종 접촉 마찰까지 0.05라고 읽을 수는 없습니다.
같은 두 에셋이라도 결합 방식이 바뀌면 값이 달라집니다. 곱(Multiply)이 선택되는 조건이라면 0.05 × 0.8 = 0.04가 되고, 최솟값(Min)이라면 더 작은 0.05가 됩니다. 그래서 실제로 비교할 때는 양쪽 재질의 덮어쓰기 설정과 최종적으로 선택된 결합 방식을 함께 기록합니다.
물리 재질과 성능
물리 재질 자체는 성능에 큰 영향을 주지 않지만, 그것으로 생기는 물리 시뮬레이션의 복잡도는 성능에 영향을 줄 수 있습니다. 먼저 Density를 지나치게 낮거나 높게 정하지 않습니다. 질량 차이가 극단적이면 물리 시뮬레이션이 불안정해질 수 있으므로 현실적인 범위를 지킵니다. 또 너무 많은 물체가 동시에 물리 시뮬레이션에 참여하거나 복잡한 상호작용이 한꺼번에 일어나는 것을 피합니다.
표면 타입은 충돌할 때 소리와 파티클을 다르게 재생하는 데 쓸모가 있으므로, Project Settings의 Physics에 있는 Physical Surface에서 필요한 타입을 미리 정의해 둡니다. 그리고 멀리 있는 물체에까지 물리 시뮬레이션을 켜 두지 않도록, 물체가 멈추면 계산을 쉬게 하는 잠들기(sleep)나 별도의 거리 기반 활성화 로직을 씁니다. 렌더링의 Cull Distance는 그리지 않게 할 뿐, 물리 시뮬레이션을 자동으로 멈추지 않습니다. 물리 비용은 물리 시뮬레이션 성능 조정에서 자세히 다룹니다.
정리
- 물리 재질은 마찰, 반발, 밀도, 표면 타입을 담는 데이터 에셋으로, 화면에 보이는 재질과 별개이며 겉모습을 바꾸지 않습니다.
- 맞닿은 두 표면의 실제 마찰과 반발은 양쪽의 값과 결합 방식(Average, Min, Max, Multiply)으로 정해집니다.
- 밀도의 단위는 g/cm³이며,
Override Mass를 켜지 않았을 때 형상과 함께 질량 계산에 쓰입니다. - 메시의
Simple Collision Physical Material은 그 에셋을 쓰는 모든 배치의 단순 충돌 기본값이고, 컴포넌트의Phys Material Override는 그 배치 하나에만 적용됩니다. - 재질의
Phys Material은 주로 복잡 충돌과 트레이스의 표면 경로이므로, 쓰는 충돌이 단순인지 복잡인지 먼저 확인합니다. - 표면 타입은 Hit Result의 물리 재질에서 읽어 효과를 고르는 데이터이며, 캐릭터 이동의 Ground Friction은 표면의 Friction을 자동으로 가져오지 않습니다.
연습 문제
1. 결합 방식이 Min이라면
두 표면의 마찰 계수가 0.05와 0.8이고, 이번에 최솟값(Min) 결합 방식이 선택되었다면 결합한 값은 얼마일까요? 이 값을 캐릭터의 Ground Friction으로 그대로 써도 될까요?
해설 보기
최솟값은 둘 가운데 작은 값을 고르므로 0.05입니다. 이것은 이번에 Min이 선택되었다는 조건에서의 계산입니다.
이 값을 캐릭터의 Ground Friction과 같은 값으로 취급할 이유는 없습니다. 캐릭터 무브먼트 컴포넌트의 Ground Friction은 물리 재질의 마찰 계수와 별개의 설정이라, 캐릭터가 미끄러지는 느낌은 따로 로직으로 연결해 조정해야 합니다.
2. 한 상자만 얼음처럼
같은 상자 메시를 쓰는 상자 열 개 가운데 하나만 얼음처럼 미끄럽게 만들고 싶습니다. 스태틱 메시 에셋의 Simple Collision Physical Material을 PM_Ice로 바꾸는 것과, 그 상자 컴포넌트의 Phys Material Override에 PM_Ice를 지정하는 것은 결과가 어떻게 다를까요?
해설 보기
스태틱 메시 에셋의 Simple Collision Physical Material은 그 에셋을 쓰는 모든 배치가 공유하는 기본값이라, 바꾸면 열 개 상자가 모두 얼음처럼 미끄러워집니다.
반면 한 상자 컴포넌트의 Phys Material Override에 지정하면 그 배치 하나의 단순 충돌만 PM_Ice를 쓰고, 나머지 아홉 개는 원래 기본값을 그대로 씁니다. 하나만 바꾸려면 덮어쓰기를 씁니다.
3. 표면 타입을 정했는데 소리가 그대로
금속 바닥의 물리 재질에 표면 타입을 Metal로 정했는데, 캐릭터가 걸어도 발소리가 다른 바닥과 똑같습니다. 무엇이 빠졌을까요?
해설 보기
표면 타입은 효과를 고르기 위한 데이터일 뿐, 지정한다고 소리가 저절로 바뀌지 않습니다. 발소리를 내는 로직이 발이 닿은 바닥의 Hit Result에서 물리 재질을 읽고, Get Surface Type으로 얻은 표면 타입을 Switch on EPhysicalSurface로 나눠 Metal일 때 금속 발소리를 재생해야 합니다.
그 로직이 있는데도 바뀌지 않는다면, 발 아래를 검사하는 트레이스가 물리 재질을 돌려주도록 설정되어 있는지, 그리고 그 트레이스가 단순 충돌과 복잡 충돌 가운데 어느 경로로 바닥의 물리 재질을 읽는지 확인합니다.
물리 재질의 속성은 Epic의 물리 재질 안내에서 확인할 수 있습니다.
다음 글 물리 기반 캐릭터 제어에서는 캐릭터 무브먼트 컴포넌트로 걷기와 점프, 낙하를 조정하고, 물리 재질과 캐릭터의 움직임을 직접 연결하는 방법을 다룹니다.