Physics Material
Physics Material은 Collider 표면의 마찰과 탄성을 조절하는 에셋입니다. 얼음·고무 느낌을 Friction·Bounciness·Combine으로 만들고, runtime 교체와 sharedMaterial 차이를 이해하는 Unity 표면 물리 가이드입니다.
상상해 보세요...
Physics Material은 놀이터 바닥과 같습니다. 거친 콘크리트 → 공이 빨리 멈춤(높은 마찰). 매끄러운 돌 → 멀리 미끄러짐(낮은 마찰). 고무 → 높이 튕김(높은 탄성). 모래 → 둔탁하게 떨어짐(낮은 탄성). Unity에서는 독립 에셋으로 만든 뒤 아무 Collider에 할당해 세계와의 상호작용을 바꿉니다.
개념 자세히
Physics Material(3D는 .physicMaterial, 2D는
.physicsMaterial2D)은 ScriptableObject에 가까운 에셋으로 네 핵심 필드가
있습니다:
Dynamic Friction(미끄러질 때, 0–1),
Static Friction(정지에서 움직이기 시작할 때,
보통 Dynamic보다 큼), Bounciness(0 = 안
튕김, 1 = 최대), 그리고 두 combine 모드 —
Friction Combine과
Bounce Combine(Average/Min/Max/Multiply).
Physics Material이 다른 두 Collider가 만나면 Unity가 값을 합칩니다. Average: friction = (frictionA + frictionB) / 2. Minimum: friction = min(frictionA, frictionB) — 얼음에 유용(한쪽이 0이면 항상 이김). Combine 우선순위: Average < Minimum < Maximum < Multiply.
중요: Unity에서 Bounciness = 1은 무손실
튕김이 아닙니다. 튕김 사이에도 damping과 중력이 작용합니다. 거의 완벽한
튕김을 원하면 Bounciness = 1, Bounce Combine = Maximum, Rigidbody
drag = 0.
런타임에 collider.material 또는
collider.sharedMaterial로 교체할 수 있습니다. 같은 에셋을 공유하는 모든
인스턴스에 영향을 주려면 sharedMaterial(메모리 절약).
실제 머티리얼 프리셋
🧱 벽돌
Dynamic Friction: 0.6
Static Friction: 0.6
Bounciness: 0.0
🧊 얼음
Dynamic Friction: 0.02
Static Friction: 0.02
Bounciness: 0.0
🏀 고무
Dynamic Friction: 0.8
Static Friction: 0.8
Bounciness: 0.8
🪵 나무
Dynamic Friction: 0.48
Static Friction: 0.48
Bounciness: 0.0
| Combine Mode | 공식 | 사용할 때 |
|---|---|---|
| Average | (A + B) / 2 | 기본값, 평균 |
| Minimum | min(A, B) | 얼음 (한쪽이 0이면 그 값이 이김) |
| Maximum | max(A, B) | 고무 (최대 반발) |
| Multiply | A × B | 점착 표면, 곱셈 |
실습 단계
Physics Material 만들기
Project Panel → 우클릭 → Create → Physics Material(3D) 또는 Physics Material 2D. 표면 이름으로(Rubber, Ice...).
Friction과 Bounciness 설정
Dynamic Friction(0–1), Static Friction(0–1), Bounciness(0–1). 프리셋 표를 쓰거나 실험합니다.
Combine Mode 고르기
Friction/Bounce Combine: 기본은 Average. 얼음은 Minimum, 통통 고무는 Maximum.
Collider에 할당
GameObject 선택 → Collider → "Material" 슬롯 → Project에서 Physics Material을 드래그.
플레이하며 조절
Play Mode로 들어가 움직임을 보고 값을 조정합니다. 플레이 중에도 Physics Material을 편집할 수 있습니다.
인터랙티브 시뮬레이터
Friction과 Bounciness를 조절한 뒤 공을 떨어뜨려 효과를 보세요.
값을 설정한 뒤 "공 떨어뜨리기"를 누르세요
코드 예제
기본캐릭터가 다른 표면에 설 때 런타임에 Physics Material을 교체합니다.
using UnityEngine;
public class SurfaceMaterialSwapper : MonoBehaviour
{
public PhysicMaterial normalMat, iceMat, rubberMat;
Collider col;
void Start() => col = GetComponent<Collider>();
void OnCollisionStay(Collision collision)
{
// Read the ground tag
string tag = collision.gameObject.tag;
col.material = tag switch
{
"Ice" => iceMat,
"Rubber" => rubberMat,
_ => normalMat,
};
}
void OnCollisionExit(Collision _)
{
col.material = normalMat; // Restore when leaving the ground
}
}코드 예제
고급런타임에 Physics Material을 생성하고 게임 상태로 조절 — 에셋 파일 불필요.
using UnityEngine;
// Create and own a PhysicMaterial at runtime — no Project asset
public class DynamicPhysicsMaterial : MonoBehaviour
{
Collider col;
PhysicMaterial dynMat;
[Range(0f, 1f)] public float friction = 0.4f;
[Range(0f, 1f)] public float bounciness = 0f;
void Awake()
{
col = GetComponent<Collider>();
// Runtime PhysicMaterial, no Project asset needed
dynMat = new PhysicMaterial("Dynamic")
{
dynamicFriction = friction,
staticFriction = friction * 1.2f,
bounciness = bounciness,
frictionCombine = PhysicMaterialCombine.Average,
bounceCombine = PhysicMaterialCombine.Maximum
};
col.material = dynMat;
}
// Call from elsewhere to change live (e.g. character frozen)
public void SetIce()
{
dynMat.dynamicFriction = 0.01f;
dynMat.staticFriction = 0.01f;
col.material = dynMat; // Re-assign so Unity picks up the new values
}
}📌 빠른 정리
- ▸0 = 마찰/튕김 없음, 1 = 최대
- ▸Static Friction > Dynamic Friction(실제 물리)
- ▸Minimum Combine: 한쪽이 0 → 결과 0(이상적 얼음)
- ▸col.material은 사본; sharedMaterial은 공유
- ▸런타임에 PhysicMaterial 수정 후 col.material 재할당
⚠️ 흔한 실수
❌ 재할당 없이 collider.material.bounciness = X만 설정
Unity가 내부 변경을 감지하지 않음 — 값이 남음
✅ 새 값을 만들고 할당: col.material = updatedMat;
❌ Bounciness = 1인데도 공이 에너지를 잃음
Rigidbody.drag > 0과 중력이 에너지를 먹음
✅ drag = 0, Bounce Combine = Maximum