물리, 충돌

1. 물리 시뮬레이션의 핵심: Rigidbody

Rigidbody는 게임 오브젝트에 물리 엔진을 적용하여 질량, 중력, 마찰력 등을 계산하는 컴포넌트입니다.

🛠️ 주요 속성 (Property)

속성 설명 참고
Mass 질량. F=ma 계산 시 힘의 효율을 결정 기본값 1
Drag 선형 감속 (공기 저항 효과) 0이면 감속 없음
Angular Drag 회전 감속
0이면 회전 감속 없음
Use Gravity 중력 적용 여부
체크 시 유니티 기본 중력(−9.81m/s2) 적용
Is Kinematic 물리 엔진의 영향을 받지 않고 스크립트로 제어 충돌 감지만 가능
Interpolate 프레임 간 이동 보간
시각적인 부드러움 제공
Collision Detection 충돌 검출 방식
Discrete / Continuous 등
Constraints 특정 축의 이동 및 회전 고정
Freeze Position / Rotation

💻 주요 메서드 및 프로퍼티

  • AddForce(Vector3 force): 특정 방향으로 물리적인 힘을 가합니다. (누적 가능)
  • AddTorque(Vector3 torque): 물체에 회전력을 더합니다.
  • velocity: 현재 오브젝트의 속도(물리력)입니다.
  • angularVelocity: 현재 오브젝트의 회전 속도입니다.


2. 충돌 영역 정의: Collider

오브젝트의 형체를 정의하고 충돌을 감지하는 컴포넌트입니다.

  • 일반 Collider: 물리적인 벽 역할을 하여 서로 통과하지 못하게 합니다.
  • Is Trigger (체크 시): 물리적인 밀려남은 없지만, 영역 진입 여부만 감지합니다. (예: 포탈, 아이템 습득 영역)


3. 충돌 이벤트와 콜백 (Callback)

충돌 상황에 따라 유니티가 자동으로 호출해주는 함수들입니다.

💥 Collision vs Trigger 비교

구분 Collision (일반 충돌) Trigger (트리거)
IsTrigger 옵션 체크 해제 (False) 체크 필수 (True)
물리 반응 튕겨나감, 부딪힘 발생
물리 반응 없음 (통과함)
필수 조건 양쪽 모두 Collider + 최소 한쪽 Rigidbody
최소 한쪽 Rigidbody 포함
매개변수 타입 Collision (상대 정보, 힘, 접점 포함)
Collider (상대 컴포넌트 정보만 포함)

📝 대표 이벤트 코드

// 일반 충돌 (Collision)
void OnCollisionEnter(Collision collision) { /* 충돌 시작 */ }
void OnCollisionStay(Collision collision) { /* 충돌 중 (지양) */ }
void OnCollisionExit(Collision collision) { /* 충돌 종료 */ }

// 트리거 충돌 (Trigger)
void OnTriggerEnter(Collider other) { /* 진입 */ }
void OnTriggerStay(Collider other) { /* 영역 안 (지양) */ }
void OnTriggerExit(Collider other) { /* 탈출 */ }

💡 Tip: Stay 함수는 충돌 중 매 프레임 호출되어 성능에 부담을 줍니다. 가급적 Enter와 Exit만 사용하는 것이 최적화에 유리합니다.


4. 2D 물리 (Physics 2D)

3D와 원리는 동일하며, 컴포넌트 이름과 메서드 뒤에 **'2D'**만 붙여주면 됩니다.

  • 컴포넌트: Rigidbody2D, BoxCollider2D 등
  • 이벤트: OnCollisionEnter2D, OnTriggerEnter2D 등

5. 문제 해결 및 최적화 (Troubleshooting)

  • 충돌 이벤트가 발생하지 않을 때: 최소 한쪽 오브젝트에 Rigidbody가 있는지 확인하세요.
    • 충돌이 안 일어날 때 체크리스트 (Troubleshooting)
    • 가장 많이 실수하는 부분들이 이미지에 잘 정리되어 있습니다.
      문제 상황 원인 해결 방법
      충돌 이벤트 미발생 Rigidbody가 없는 Collider끼리 충돌
      최소 한쪽에 Rigidbody 추가
      물리 반응 없음 Rigidbody가 IsKinematic = true 상태
      물리 반응 필요 시 IsKinematic 해제
      이벤트 종류 불일치 Collider의 IsTrigger 옵션 여부
      Trigger 체크 시 OnTriggerXXX 사용

      일반 Collider는 OnCollisionXXX 사용
  • 물리 연산의 타이밍: Update()가 아닌 FixedUpdate()에서 물리 관련 연산을 수행해야 안정적입니다.
  • Layer & Tag 활용:
    • Tag: 특정 오브젝트를 식별할 때 유용합니다.
    • Layer: Collision Matrix를 통해 특정 레이어끼리만 충돌하게 설정하여 연산량을 획기적으로 줄일 수 있습니다.


🌟 이해 및 마무리

물리와 충돌은 게임의 상호작용을 만드는 가장 기초이자 핵심입니다. 하지만 연산량이 많으므로 불필요한 Rigidbody 사용을 자제하고, 단순한 형태의 Collider(Box, Sphere)를 사용하는 등의 최적화 습관이 중요합니다.

 

'유니티 > UnityEngine3D 입문 및 스크립팅 기초' 카테고리의 다른 글

코루틴  (0) 2026.01.02
Transform 및 위치 이동  (0) 2026.01.01
오브젝트, 프리팹, 생성과 파괴  (0) 2026.01.01
유니티 개요  (0) 2026.01.01