02 물리·충돌 - jes79/Unity-AI-Glossary-Playground GitHub Wiki
02 물리·충돌
"부딪혀도 반응이 없어요"는 대부분 Collider/Trigger/레이어 문제입니다. 요청할 때 2D인지 3D인지 꼭 밝히세요.
씬 14개 · 폴더 Assets/00_Scenes/02_Physics
| 번호 | 용어 | 쉽게 말하면 | 씬에서 보여 주는 것 | 구현 방식 |
|---|---|---|---|---|
| 0201 | Collider | 충돌 모양 (Box, Sphere, Capsule, Mesh) | SphereCollider 총알이 벽에 맞으면 사라짐, Collider 종류 비교 | 런타임 데모 |
| 0202 | Trigger (Is Trigger) | 통과는 되지만 '닿았다'만 감지 | Trigger 코인 OnTriggerEnter로 점수 +10, Is Trigger 끄기 비교 | 런타임 데모 |
| 0203 | OnCollisionEnter / OnTriggerEnter | 충돌·접촉 순간 실행되는 함수 | 적과 OnCollisionEnter 시 체력 감소, 콜백 6종 로그 | 런타임 데모 |
| 0204 | Layer / Layer Collision Matrix | 어떤 그룹끼리 부딪힐지 설정 | IgnoreLayerCollision으로 적 총알이 적끼리 안 맞게, 매트릭스 UI | 런타임 데모 |
| 0205 | Tag | 오브젝트 이름표 | Enemy 태그만 데미지, 태그 검사 끄기 비교 | 런타임 데모 |
| 0206 | Raycast | 보이지 않는 레이저로 앞에 뭐가 있는지 검사 | 카메라 중앙 Raycast로 맞은 오브젝트 이름 출력 | 런타임 데모 |
| 0207 | SphereCast / OverlapSphere | 원형 범위 검사 | 폭발 반경 5m OverlapSphere 데미지, SphereCast 비교 | 런타임 데모 |
| 0208 | AddForce / Impulse | 힘을 가해 밀기 | AddExplosionForce로 상자 날리기, ForceMode 4종 비교 | 런타임 데모 |
| 0209 | 넉백 (Knockback) | 맞으면 뒤로 밀려남 | 피격 시 공격자 반대 방향 넉백 3 | 런타임 데모 |
| 0210 | Physics Material | 마찰·탄성 설정 | Bounciness 0.8 공 등 탄성·마찰 비교 | 런타임 데모 |
| 0211 | 히트박스 / 허트박스 | 공격 판정 범위 / 맞는 판정 범위 | 휘두르기 중 0.1초만 히트박스 활성, 타임라인 UI | 런타임 데모 |
| 0212 | 래그돌 (Ragdoll) | 죽으면 몸이 축 늘어지는 물리 | 클릭하면 Animator 끄고 래그돌 전환 | 런타임 데모 |
| 0213 | Joint (Hinge, Spring) | 물체끼리 연결 (문, 밧줄) | HingeJoint 문, SpringJoint 추, 밧줄 | 런타임 데모 |
| 0214 | 터널링 / Continuous 충돌 | 빠른 물체가 벽을 뚫고 지나가는 현상 / 해결 설정 | 빠른 총알 Discrete는 벽 뚫고 Continuous는 막힘 | 런타임 데모 |
항목별 상세
0201
Collider — 충돌 모양 (Box, Sphere, Capsule, Mesh)
요청 예문: "총알에 SphereCollider를 달고 벽에 맞으면 사라지게 해줘."
- 씬:
Assets/00_Scenes/02_Physics/0201_Collider.unity - 핵심 스크립트:
ColliderShooter, ColliderBullet - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0201_Collider.cs - 구현 방식: 런타임 데모
- 개념: 물체의 충돌 모양을 정하는 컴포넌트. 실제 보이는 메시와 별개여서, 복잡한 모델에도 Box·Sphere·Capsule 같은 단순한 모양을 씌우는 게 성능상 유리하다. MeshCollider 는 정확하지만 비싸다.
- 씬에서 보여 주는 것: SphereCollider 총알이 벽에 맞으면 사라짐, Collider 종류 비교
- 확인 포인트: 마우스 왼쪽 클릭으로 총알을 쏘고 V 로 Collider 모양을 켜 보세요. 링(MeshCollider)의 구멍은 총알이 통과하는데, 석상은 생긴 모양이 아니라 캡슐 기준으로 맞습니다.
0202
Trigger (Is Trigger) — 통과는 되지만 '닿았다'만 감지
요청 예문: "코인을 Trigger로 만들고 OnTriggerEnter에서 점수 +10 해줘."
- 씬:
Assets/00_Scenes/02_Physics/0202_Trigger.unity - 핵심 스크립트:
CoinCollector - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0202_Trigger.cs - 구현 방식: 런타임 데모
- 개념: Is Trigger 를 켠 Collider. 물체를 막지 않고 통과시키면서 닿았다는 사실만 알려 준다. 아이템 획득, 구역 진입, 함정 감지처럼 물리적으로 밀 필요 없는 판정에 쓴다.
- 씬에서 보여 주는 것: Trigger 코인 OnTriggerEnter로 점수 +10, Is Trigger 끄기 비교
- 확인 포인트: WASD 로 코인을 지나가 보세요. Trigger 가 켜져 있으면 통과하면서 점수가 +10 되고, T 로 끄면 코인이 벽처럼 막히고 점수는 오르지 않습니다.
0203
OnCollisionEnter / OnTriggerEnter — 충돌·접촉 순간 실행되는 함수
요청 예문: "적과 OnCollisionEnter 되면 플레이어 체력을 깎아줘."
- 씬:
Assets/00_Scenes/02_Physics/0203_CollisionCallbacks.unity - 핵심 스크립트:
CollisionEventPlayer, ChaserEnemy - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0203_CollisionCallbacks.cs - 구현 방식: 런타임 데모
- 개념: 충돌이나 접촉이 일어난 순간 Unity 가 자동으로 불러 주는 함수들. Enter/Stay/Exit 세 시점 × Collision/Trigger 두 종류로 나뉘며, 어느 쪽이 불리는지는 Is Trigger 설정에 따라 결정된다.
- 씬에서 보여 주는 것: 적과 OnCollisionEnter 시 체력 감소, 콜백 6종 로그
- 확인 포인트: 적과 부딪히면 OnCollisionEnter 로 체력이 깎이고, 초록 독 늪에 들어가면 Enter → Stay(초당 피해) → Exit 가 차례로 불립니다. 오른쪽 로그에서 어떤 콜백이 언제 불리는지 보세요.
0204
Layer / Layer Collision Matrix — 어떤 그룹끼리 부딪힐지 설정
요청 예문: "적 총알이 적끼리는 안 맞도록 레이어 충돌 설정 방법을 알려줘."
- 씬:
Assets/00_Scenes/02_Physics/0204_LayerCollisionMatrix.unity - 핵심 스크립트:
LayerMatrixDemo, LayerBullet - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0204_LayerCollisionMatrix.cs - 구현 방식: 런타임 데모
- 개념: 오브젝트를 레이어로 묶고, 어떤 레이어끼리 충돌할지를 표로 지정하는 설정. 아군 총알이 아군을 맞히지 않게 하거나 불필요한 충돌 계산을 줄이는 데 쓴다.
- 씬에서 보여 주는 것: IgnoreLayerCollision으로 적 총알이 적끼리 안 맞게, 매트릭스 UI
- 확인 포인트: M 으로 EnemyBullet ↔ Enemy 충돌을 끄고 켜 보세요. 켜져 있으면 뒤쪽 포탑의 총알이 앞의 적에게 막히고, 끄면 적 몸을 통과해 플레이어까지 날아옵니다.
0205
Tag — 오브젝트 이름표
요청 예문: "Enemy 태그가 붙은 것만 데미지를 받게 해줘."
- 씬:
Assets/00_Scenes/02_Physics/0205_Tag.unity - 핵심 스크립트:
TagDamageDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0205_Tag.cs - 구현 방식: 런타임 데모
- 개념: 오브젝트에 붙이는 문자열 이름표. CompareTag 로 종류를 구분하는 가장 간단한 방법이지만, 하나만 붙일 수 있고 오타를 컴파일러가 잡아 주지 않아 수가 많아지면 레이어나 인터페이스가 낫다.
- 씬에서 보여 주는 것: Enemy 태그만 데미지, 태그 검사 끄기 비교
- 확인 포인트: F 로 태그 검사를 끄고 켜며 여러 대상을 공격해 보세요. 켜면 Enemy 태그가 붙은 빨간 적만 피해를 입고, 상자·NPC·플레이어는 무시됩니다. 머리 위 글자가 각자의 태그입니다.
0206
Raycast — 보이지 않는 레이저로 앞에 뭐가 있는지 검사
요청 예문: "카메라 중앙에서 Raycast를 쏴서 맞은 오브젝트 이름을 출력해줘."
- 씬:
Assets/00_Scenes/02_Physics/0206_Raycast.unity - 핵심 스크립트:
CenterRaycaster - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0206_Raycast.cs - 구현 방식: 런타임 데모
- 개념: 한 점에서 방향으로 보이지 않는 선을 쏘아 처음 맞는 Collider 를 알아내는 함수. 총 조준, 시선 판정, 바닥 검사, 마우스로 물체 집기 등 거의 모든 판정의 기본 도구다.
- 씬에서 보여 주는 것: 카메라 중앙 Raycast로 맞은 오브젝트 이름 출력
- 확인 포인트: 화면 중앙으로 Raycast 를 쏘아 맞은 오브젝트 이름이 아래에 나오는지 보세요. L 로 LayerMask 를 걸면 유리창을 무시하고 그 뒤 물체가 잡힙니다.
0207
SphereCast / OverlapSphere — 원형 범위 검사
요청 예문: "폭발 반경 5m 안의 적을 OverlapSphere로 찾아서 데미지를 줘."
- 씬:
Assets/00_Scenes/02_Physics/0207_SphereCastOverlap.unity - 핵심 스크립트:
AreaQueryDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0207_SphereCastOverlap.cs - 구현 방식: 런타임 데모
- 개념: 점이 아니라 구를 날려 검사하는 SphereCast, 범위 안의 모든 물체를 한 번에 모으는 OverlapSphere. 폭발 범위 피해나 두꺼운 총알 판정처럼 가는 선으로는 놓치는 경우에 쓴다.
- 씬에서 보여 주는 것: 폭발 반경 5m OverlapSphere 데미지, SphereCast 비교
- 확인 포인트: 왼쪽 클릭으로 폭발시켜 반경 5m 안의 적만 피해를 입는지, 가까운 적이 더 아픈지 보세요. 주황 상자는 마스크에서 빠져 있어 범위 안에 있어도 무시됩니다.
0208
AddForce / Impulse — 힘을 가해 밀기
요청 예문: "폭발 시 주변 Rigidbody에 AddExplosionForce로 날려줘."
- 씬:
Assets/00_Scenes/02_Physics/0208_AddForceImpulse.unity - 핵심 스크립트:
ForceDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0208_AddForceImpulse.cs - 구현 방식: 런타임 데모
- 개념: Rigidbody 에 힘을 주는 함수. ForceMode 에 따라 지속적으로 미는 힘(Force), 순간 충격(Impulse), 질량 무시 속도 변화(VelocityChange) 등으로 결과가 크게 달라진다.
- 씬에서 보여 주는 것: AddExplosionForce로 상자 날리기, ForceMode 4종 비교
- 확인 포인트: Space 로 네 레인에 같은 값을 ForceMode 만 바꿔 주고 날아가는 거리를 비교해 보세요. 각 레인의 질량 1 상자와 질량 5 상자가 다르게 날아가는지도 함께 보세요.
0209
넉백 (Knockback) — 맞으면 뒤로 밀려남
요청 예문: "피격 시 공격자 반대 방향으로 넉백 3만큼 줘."
- 씬:
Assets/00_Scenes/02_Physics/0209_Knockback.unity - 핵심 스크립트:
KnockbackReceiver, KnockbackAttacker - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0209_Knockback.cs - 구현 방식: 런타임 데모
- 개념: 피격 시 공격자 반대 방향으로 밀려나는 처리. 때렸다는 감각을 전달하는 핵심 요소이고, 동시에 연속 공격을 끊어 주는 게임플레이 장치이기도 하다.
- 씬에서 보여 주는 것: 피격 시 공격자 반대 방향 넉백 3
- 확인 포인트: Space 로 적을 때려 보세요. 적이 공격 반대 방향으로 3m 밀려납니다. K 로 넉백을 끄면 같은 공격인데도 타격감이 사라지는 것을 비교해 보세요.
0210
Physics Material — 마찰·탄성 설정
요청 예문: "공이 통통 튀도록 Bounciness 0.8 Physics Material을 만들어줘."
- 씬:
Assets/00_Scenes/02_Physics/0210_PhysicsMaterial.unity - 핵심 스크립트:
PhysicsMaterialDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0210_PhysicsMaterial.cs - 구현 방식: 런타임 데모
- 개념: Collider 에 씌우는 마찰과 탄성 설정 에셋. 얼음판을 미끄럽게, 공을 통통 튀게 만드는 등 물체의 표면 성질을 코드 없이 바꿀 수 있다.
- 씬에서 보여 주는 것: Bounciness 0.8 공 등 탄성·마찰 비교
- 확인 포인트: 공들을 떨어뜨려 Bounciness 0.8 공은 계속 튀고, 0 인 공은 바로 멈추는지 보세요. 마찰이 낮은 바닥에서는 상자가 미끄러져 멀리 갑니다.
0211
히트박스 / 허트박스 — 공격 판정 범위 / 맞는 판정 범위
요청 예문: "검 휘두를 때 애니메이션 중간 0.1초만 히트박스를 켜줘."
- 씬:
Assets/00_Scenes/02_Physics/0211_HitboxHurtbox.unity - 핵심 스크립트:
SwordHitboxDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0211_HitboxHurtbox.cs - 구현 방식: 런타임 데모
- 개념: 공격이 맞는지 판정하는 범위(히트박스)와 피해를 받는 범위(허트박스)를 따로 두는 설계. 히트박스를 공격 모션 중 짧은 구간만 켜는 것이 격투·액션 게임 타격감의 핵심이다.
- 씬에서 보여 주는 것: 휘두르기 중 0.1초만 히트박스 활성, 타임라인 UI
- 확인 포인트: H 로 히트박스를 0.1초만 ↔ 휘두르는 내내로 바꿔 보세요. 0.1초만 켜면 정면 허수아비만 맞고, 내내 켜면 양옆까지 맞습니다. 아래 타임라인의 빨간 구간이 활성 시간입니다.
0212
래그돌 (Ragdoll) — 죽으면 몸이 축 늘어지는 물리
요청 예문: "적이 죽으면 애니메이터를 끄고 래그돌로 전환해줘."
- 씬:
Assets/00_Scenes/02_Physics/0212_Ragdoll.unity - 핵심 스크립트:
RagdollEnemy, RagdollDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0212_Ragdoll.cs - 구현 방식: 런타임 데모
- 개념: 캐릭터의 뼈마다 Rigidbody 와 Joint 를 붙여, 애니메이션을 끄고 물리에 몸을 맡기는 처리. 죽는 연출이 매번 달라져 자연스럽지만, Animator 를 끄지 않으면 애니메이션과 물리가 싸워 몸이 폭발한다.
- 씬에서 보여 주는 것: 클릭하면 Animator 끄고 래그돌 전환
- 확인 포인트: 적의 부위를 클릭해 쓰러뜨려 보세요. 맞은 부위와 방향에 따라 쓰러지는 모습이 매번 다릅니다. A 로 Animator 끄기를 OFF 하면(나쁜 예) 몸이 터지듯 뒤틀리는 것을 확인할 수 있습니다.
0213
Joint (Hinge, Spring) — 물체끼리 연결 (문, 밧줄)
요청 예문: "HingeJoint로 밀면 열리는 문을 만들어줘."
- 씬:
Assets/00_Scenes/02_Physics/0213_Joints.unity - 핵심 스크립트:
JointDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0213_Joints.cs - 구현 방식: 런타임 데모
- 개념: 두 Rigidbody 를 물리적으로 잇는 컴포넌트. Hinge 는 경첩처럼 한 축으로 돌고, Spring 은 고무줄처럼 당긴다. 문, 밧줄, 사슬, 흔들다리 같은 장치에 쓴다.
- 씬에서 보여 주는 것: HingeJoint 문, SpringJoint 추, 밧줄
- 확인 포인트: WASD 로 몸으로 가운데 문을 밀어 열어 보세요. L 로 각도 제한을, C 로 자동 닫힘(Spring)을 끄고 켜며 차이를 보세요. 오른쪽 추와 왼쪽 밧줄도 끌어 보세요.
0214
터널링 / Continuous 충돌 — 빠른 물체가 벽을 뚫고 지나가는 현상 / 해결 설정
요청 예문: "빠른 총알이 벽을 뚫고 지나가. Continuous Collision Detection으로 고쳐줘."
- 씬:
Assets/00_Scenes/02_Physics/0214_TunnelingCCD.unity - 핵심 스크립트:
TunnelingDemo, TunnelingBullet - 빌더:
Assets/01_Scripts/Editor/Scenes/02_Physics/Build0214_TunnelingCCD.cs - 구현 방식: 런타임 데모
- 개념: 빠른 물체가 한 프레임에 벽을 지나쳐 충돌을 놓치는 현상(터널링)과, Collision Detection 을 Continuous 로 바꿔 이동 경로 전체를 검사하게 하는 해결책. 총알·빠른 투사체에서 자주 문제가 된다.
- 씬에서 보여 주는 것: 빠른 총알 Discrete는 벽 뚫고 Continuous는 막힘
- 확인 포인트: 같은 속도의 총알을 두 발 쏴 비교해 보세요. Discrete 총알은 얇은 벽을 그냥 통과하고, Continuous 총알은 벽에 정확히 막힙니다.