Unity의 Rigidbody 정리

Hyeon O·2025년 5월 16일

개요

유니티 엔진에서 정말 많이 사용되는 Rigidbody 컴포넌트에 대해서 완벽하게 이해해보자.

유니티 공식 문서 링크

Rigidbody란?

Rigidbody는 ‘강체’라는 뜻으로 힘이나 토크를 받아서 움직이도록 할 때 사용되는 개념이다.

우리 현실 세계에서 빗대어 생각해보면 우리 주변의 모든 물체는 이 특성을 가지고 있다.

뭐, 유령이나 뭔가 영적 대상에게는 이 특성이 없다고 생각해 볼 수 있다.

또한 빛이나 소리에도 이런 특성은 없다.

재미있는 예시로는 귀신에게 물리적인 상호작용을 할 수 없다.

하지만 Rigidbody 컴포넌트를 귀신에게 넣는다면? 물리적으로 한판 싸울 수 있다.

즉, 어느 오브젝트에 Rigidbody 컴포넌트가 들어가 있다면 그 오브젝트는 물리 세계에 상호작용 가능한 오브젝트로 정의될 수 있는 것이다.

Unity의 Rigidbody

유니티에서 Rigidbody는 유니티의 물리 엔진에 의해 제어되는 오브젝트의 운동을 자동으로 처리하기 위한 컴포넌트다.

이를 통해 중력, 마찰, 힘, 충돌 등의 물리 현상을 게임 오브젝트에 적용할 수 있다.

유니티에서 Rigidbody,Rigidbody2D가 있다 각 컴포넌트에 대해서 더 자세히 알아보자.

Rigidbody 컴포넌트의 속성

위 이미지는 Rigidbody 컴포넌트의 인스펙터 창에 보여지는 속성들이다.

  • Mass : 질량을 의미한다.
    타입은 float이고
    충돌 계산, 힘 가속도 등에 영향을 끼치는 속성이다.

  • Drag : 선속도 감쇠 계수를 의미한다. 이는 공기 저항 같은 효과이다.
    타입은 float이고
    이 값이 0 이상이라면 물체가 천천히 멈추게 한다.

  • Angular Drag : 회전 속도 감쇠 계수를 의미한다.
    타입은 float이고
    값이 높을 수록 회전을 빠르게 멈춘다.

  • Automatic Center of Mass : 질량 중심에 대한 속성으로
    질량 중심이란, 물리적으로 물체의 무게가 집중되어 있는 가상의 한 점을 의미한다.
    이 속성을 체크 하면, 모든 콜라이더의 모양과 배치에 따라 자동으로 이 점을 계산한다.
    직접 수동으로 설정이 가능하고, 코드로 설정이 가능하다.
    rigidbody.centerOfMass = new Vector3(x, y, z) → 직접 코드로 설정 시

질량 중심은 무게 중심과 매우 비슷한 개념이다.
물리학적으로 약간의 차이는 있지만 게임 개발에서는 거의 동일하게 취급되는 경우가 많다.

  • Automatic Tensor : 회전에 대한 관성을 의미한다.
    체크 시 연결된 모든 콜라이더를 기반 자동 계산하여 회전에 대한 관성 값을 가진다.
    수동으로 설정 가능하다.
    - Inertia Tensor 관성 텐서 값 정의
    - Inertia Tensor Rotation 관성 텐서의 회전을 정의

  • Use Gravity : 중력 효과를 설정하는 속성이다.
    체크 시 중력의 영향을 받게 된다.

  • Is Kinematic : Kinematic(운동학) 여부를 결정하는 속성이다.
    Kinematic은 질량은 고려하지 않는 운동이다.
    따라서 이 속성이 활성화되면 오브젝트를 움직이거나 회전하는데 힘을 가할 수 없고,
    Tranform으로 직접 조작을 통해 위치 이동할 수 있다.
    하지만 다른 Rigidbody와 Trigger 감지는 가능하다.

  • Interpolate : 런타임에 Ridigbody의 모션이 흔들리는 것 같을 때 부드럽게 처리하는 속성이다.
    이를 처리하기 위해 두 가지 옵션을 제공한다.
    - Interpolate : 이전 물리 프레임과 현재 사이 보간
    - Exinterpolate : 다음 프레임을 예측해서 보간
    - None : 위치 보간 없음, 고속 움직임 시 끊겨 보일 수 있다.

  • CollisionDetectionMode : 물리 시스템이 이 Ridigbody의 콜라이더와 씬 내의 다른 콜라이더 간의 충돌을 감지하는 방법을 정의하는 속성이다.
    4가지 옵션을 제공한다.

    • Discrete : 불연속 충돌 검사를 사용, 저속 물체에 적합하다. 간혹 충돌이 누락될 수 있다.
    • Continuous : 스위칭 기반 CCD를 사용하여 정적 콜라이더와 충돌을 계산한다.
      이 Ridigbody를 가진 오브젝트가 정적 콜라이더와 빠르게 움직이는 충돌의 경우 이 옵션을 선택한다. 즉, 고속 물체에 적합하다. 다만 정적 콜라이더와 충돌의 경우에다.
    • Continuous Dynamic : 위 옵션과 같은 기반으로
      이 Ridigbody를 가진 오브젝트와 Discrete 로 설정된 오브젝트 제외 모든 콜라이더 간 충돌을 계산한다.
      여러 고속 물체의 경우 이 옵션을 선택한다.
      가장 많은 리소스를 사용하기에 프로그램이 많이 무거워진다는 점을 기억하자.
    • Continuous Speculative : 추측성 연속 충돌 검사를 사용하여 이 리지드바디의 콜라이더와 다른 모든 콜라이더 간의 충돌을 계산한다.
      Rigidbody의 충돌 정확도가 중요하지 않다면 이 옵션을 선택한다.
      Discrete보다 리소를 많이 사용하지만, 나머지 보단 덜하다.
  • Constraints : Rigidbody의 특정 방향 이동/회전을 고정할 수 있다.

추가적으로 Sleeping Mode라는 속성이 있는데,

이 속성은 Rigidbody2D inspector에만 보인다.

노출되지 않을 뿐 기능적으로 사용 가능하다.

이 기능은 최적화를 위한 것으로

물리적인 계산 이벤트가 없는 물체에 대해서 물리 시스템이 물리 계산에 포함하지 않도록 한다.

2D에는 이 속성을 inspector에 표기하는데 공식문서에서는 다음과 같이 설명한다.

여기까지 3D 월드의 오브젝트에 주로 쓰이는 Rigidbody에 대한 속성을 정리해 보았다.

Rigidbody의 메서드

Rigidbody 컴포넌트를 가진 오브젝트에게

힘을 가하거나 회전, 이동 등 물리적인 효과를 부여할 수 있는 메서드를 정리해보자.

아래는 힘 또는 토크를 가하는 메서드를 정리한 표다.

메서드설명사용 예
AddForce(Vector3 force, ForceMode mode)물체에 힘을 가함밀기, 점프
AddRelativeForce(Vector3 force, ForceMode mode)자신의 로컬 좌표계 기준으로 힘 적용로켓 추진
AddTorque(Vector3 torque, ForceMode mode)회전력(토크) 가함바퀴 회전
AddRelativeTorque(Vector3 torque, ForceMode mode)로컬 회전력 적용로컬 회전 방향 제어
AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRadius, float upwardsModifier, ForceMode mode)폭발 위치 기준으로 힘을 주변 물체에 적용폭탄 이펙트

ForceModeForce, Impulse, VelocityChange, Acceleration 네 가지 중 선택 가능하다.

  • Force: 부드럽고 점진적
  • Impulse: 순간적 충격
  • VelocityChange: 질량 무시, 즉시 속도 변화
  • Acceleration: 질량 무시하고 일정 가속

다음으로 위치/회전 이동 관련 메서드이다.

메서드설명주의사항
MovePosition(Vector3 position)Rigidbody를 물리적으로 해당 위치로 이동시킴isKinematic = true여야 자연스럽게 작동
MoveRotation(Quaternion rotation)물리 기반 회전 이동 수행직접 회전값 조절할 때 사용
Sleep()Rigidbody를 ‘수면 상태’로 강제 전환 (물리 연산 중지)멈춰있는 오브젝트 최적화
WakeUp()수면 상태에서 강제로 깨움움직이게 하려면 호출 필요
IsSleeping()현재 수면 상태인지 여부 반환상태 확인용
👉🏽`MovePosition()`과 `MoveRotation()`은 일반적으로 **FixedUpdate()에서 호출해야** 물리 연산과 충돌이 안정적으로 처리된다.

속도를 직접 제어하기 위한 속성는 다음과 같다.

메서드/속성설명
velocity선속도 (Vector3). 직접 설정 가능
angularVelocity회전 속도 (Vector3, rad/s 단위). 직접 설정 가능
//선속도 10으로 설정하려면
rb.velocity = transform * 10f;

만일 질량 중심 및 관성을 제어하고 싶다면

centerOfMass, inertiaTensor, inertiaTensorRotatio 속성에 직접 할당해야한다.

다만 직접하면 자동 게산은 중지된다.

profile
천천히, 꾸준하게, 끝까지

0개의 댓글