
Rigidbody는 움직임, 중력, 충돌과 같은 물리 기반 동작을 가능하게 한다.
Unity에서는 Rigidbody 컴포넌트와 Rigidbody 클래스 사용하여 Rigidbody를 설정할 수 있다.
실제 물리에서 Rigidbody는 물리적 힘에 따라 변형되거나 변형되지 않는 모든 물리적 바디를 말한다. Rigidbody의 주어진 두 점 사이의 거리는 Rigidbody에 가해지는 외부 힘에 관계없이 시간에 따라 일정하게 유지된다.
예를 들어, Rigidbody 내의 두 점 A와 B가 있다면, 이 두 점 사이의 거리는 Rigidbody가 회전하거나 이동할 때도 변하지 않는다.
이 개념을 통해 Rigidbody는 다음과 같은 특성을 가진다.
변형되지 않음: Rigidbody는 외부의 힘이나 토크에 의해 모양이 변하지 않는다. 즉, Rigidbody 내의 모든 점들은 서로 고정된 위치를 유지한다.
안정적인 물리적 모델: Rigidbody를 사용하면 게임 오브젝트가 물리 엔진에 의해 계산될 때 더 예측 가능하고 안정적인 움직임을 보인다. 물리 엔진은 Rigidbody의 질량 중심과 외부 힘을 기반으로 이동과 회전을 계산한다.
효율적인 계산: Rigidbody는 변형되지 않기 때문에 물리 엔진은 복잡한 변형 계산을 할 필요가 없고, 단순히 이동과 회전만 계산하면 된다.
Unity의 PhysX 시스템에서 움직임, 중력, 충돌, 조인트와 같은 물리 기반 동작을 시뮬레이션 하려면 게임 오브젝트에 Rigidbody 컴포넌트를 추가하면 된다.
Unity에서 Rigidbody 컴포넌트는 게임 오브젝트의 움직임과 포지션을 제어하는 물리 기반 방법을 제공한다. Transform 프로퍼티 대신 시뮬레이션된 물리 힘과 토크를 사용하여 게임 오브젝트를 이동하고 물리 엔진이 결과를 계산하도록 할 수 있다.
대부분의 경우 게임 오브젝트에 Rigidbody가 있을 때, 게임 오브젝트를 이동하려면 Transform 프로퍼티 대신 Rigidbody 프로퍼티를 사용해야 한다.
Rigidbody 프로퍼티는 물리 시스템의 힘과 토크를 적용하여 게임 오브젝트의 Transform을 변경하는데, Transform을 직접 변경하면 Unity가 물리 시뮬레이션을 올바르게 계산하지 못하여 원치 않는 동작이 발생할 수 있다.
특히 Joint가 있는 Rigidbody의 경우 더욱 그렇다.
Joint는 Rigidbody를 다른 Rigidbody에 연결하거나 공간의 고정된 지점에 연결하여 Rigidbody를 움직이는 힘을 가하거나 제한할 수 있다.
Unity는 로컬이 아닌 전역으로 물리 기반 움직임을 처리한다.
Rigidbody가 있는 게임 오브젝트가 물리 기반 움직임을 통해 움직이면 부모 또는 자식 게임 오브젝트의 위치나 회전에 영향을 받지 않고 독립적으로 움직인다.
Rigidbody가 있는 자식 게임 오브젝트는 여전히 부모 게임 오브젝트를 기준으로 초기 위치가 정의되지만, 물리 기반 움직임은 전역에서 처리되므로, 물리 엔진은 이 초기 위치를 기준으로 전역 좌표계에서 움직임을 처리한다.
즉, Rigidbody가 적용된 오브젝트는 부모 또는 자식 관계가 있더라도 물리적 힘과 충돌에 대해 독립적으로 반응하고 움직인다는 뜻이다.
Rigidbody를 제어하기 위한 주요 클래스는 AddForce(게임 오브젝트에 힘 추가) 와 AddTorque(게임 오브젝트에 토크 추가)가 있다.
토크(Torque)는 회전 운동에서의 힘의 개념으로, 물체를 회전시키는 능력을 말한다.
물리학에서 토크는 힘과 그 힘이 작용하는 지점에서 회전축까지의 거리(레버 암)의 곱으로 정의된다.
토크(τ)=(힘의 작용점까지의 거리)r × 가한 힘(F)
게임 개발에서 토크는 게임 오브젝트를 회전시키는 데 사용된다.
Unity에서 물리 기반이 아닌 움직임을 kinematic motion이라고 한다.
Rigidbody 컴포넌트에는 Is Kinematic 프로퍼티가 있는데, 이 프로퍼티를 활성화하면 연결된 게임 오브젝트를 물리 기반이 아닌 것으로 정의하고 물리 엔진의 제어에서 제거한다. 이렇게 하면 Unity의 물리 시뮬레이션 계산이 변경 사항을 오버라이드하지 않고도 Transform을 통해 운동학적으로 움직일 수 있다.
Kinematic Rigidbody는 물리 기반 Rigidbody 게임 오브젝트에 물리 기반 힘을 가할 수 있지만, 물리 기반 힘을 받지는 않는다. 예를 들어, Kinematic Rigidbody는 non-kinematic Rigidbody와 충돌하여 밀어낼 수 있지만, non-kinematic Rigidbody는 Kinematic Rigidbody를 밀어낼 수 없다.
Joint를 사용하여 Kinematic Rigidbody를 non-kinematic Rigidbody에 연결하는 경우, 힘을 가하여 Kinematic Rigidbody를 움직일 수 없고, non-kinematic Rigidbody만 움직일 수 있다.
하지만 Transform을 통해 Kinematic Rigidbody를 움직일 수 있으며, Joint는 non-kinematic Rigidbody의 포즈를 조정하여 Joint 한계를 충족시킬 수 있다.
Collider는 Rigidbody의 물리적 경계를 정의한다.
Unity에서 물체간의 충돌을 위해서는 적어도 한 오브젝트에 Rigidbody, 그리고 충돌하는 대상에 각각 Collider 컴포넌트가 있어야 한다.
물체간의 충돌에서 Rigidbody의 상대적 질량은 충돌시 어떻게 반응할지를 결정한다.
PhysX 물리 시스템에서는 non-kinematic Rigidbody에 배치하는 모든 Collider가 오목하지 않고 볼록해야 한다. Unity의 모든 기본 모양은 볼록하지만, Unity는 기본적으로 Mesh Collider를 오목한 것으로 간주한다.
Mesh Collider는 Mesh 에셋을 사용하여 Collider를 생성하는 컴포넌트로 게임 오브젝트의 표면을 정확하게 감싸는 Collider를 생성할 수 있어, 복잡한 모양의 오브젝트에 대해 충돌 검사를 더 정확하게 수행할 수 있게 해준다.
non-kinematic Rigidbody에 기본 Mesh Collider를 적용하면 런타임에 오류가 발생한다.
non-kinematic Rigidbody가 물리 기반 힘을 받게 하려면, Mesh Collider의 Convex 프로퍼티를 활성화하고, Unity는 연결된 Mesh를 기반으로 볼록한 Collider 모양(hull)을 자동으로 계산한다. 하지만 Mesh의 볼록한 hull은 원래 모양의 근사치일 뿐이므로 시뮬레이션이 부정확해질 수 있다.
보다 정확한 충돌 시뮬레이션을 위해 다음 방법 중 하나를 사용할 수 있다.
DCC 툴을 사용하여 Mesh를 여러 부분으로 분할하면 Unity가 볼록한 hull을 계산할 때 전체 모양을 더 잘 표현할 수 있다.
여러 개의 기본 Collider를 사용하여 Mesh와 같은 모양의 복합 Collider를 수동으로 빌드한다.
Unity의 V-HACD와 같이 모든 Mesh의 볼록한 근사치를 계산하는 자동 툴을 사용한다.
Rigidbody가 Kinematic인 경우, 어떤 Collider라도 적용할 수 있다.

게임 오브젝트의 질량을 정의한다(킬로그램 단위).
현실에서와 마찬가지로 질량은 물체가 중력에 의해 떨어지는 속도에 영향을 미치지 않는다.
항력, 공기 저항 또는 마찰을 시뮬레이션 하기 위해 Rigidbody의 선형 속도의 감쇠율을 정의한다.
값이 낮을수록 감소 속도가 느려지므로 게임 오브젝트가 더 오래 더 빠르게 움직인다.
(무거운 실제 오브젝트를 시뮬레이션할 때 유용)
값이 높을수록 감소 속도가 빨라지므로 게임 오브젝트가 짧은 시간 동안 느려진다.
(가벼운 실제 오브젝트를 시뮬레이션할 때 유용)
항력, 공기 저항 또는 마찰을 시뮬레이션 하기 위해 Rigidbody의 회전 속도의 감쇠율을 정의한다.
값이 낮을수록 감소 속도가 느려지므로 게임 오브젝트가 더 오래 더 빠르게 움직인다.
(무거운 실제 오브젝트를 시뮬레이션할 때 유용)
값이 높을수록 감소 속도가 빨라지므로 게임 오브젝트가 짧은 시간 동안 느려진다.
(가벼운 실제 오브젝트를 시뮬레이션할 때 유용)
Angular Drag를 무한대로 설정하는 것 만으로는 게임 오브젝트의 회전을 멈추게 할 수 없다.
활성화하면 Rigidbody의 모양과 크기를 기반으로 물리 시스템의 예측 질량 중심을 사용할 수 있다.
비활성화하면 질량 중심에 대한 자체 X, Y, Z 좌표를 설정할 수 있다.
활성화하면 연결된 모든 Collider를 기반으로 Rigidbody에 물리 시스템의 예측 텐서 및 텐서 회전을 사용할 수 있다.
질량과 관성 텐서는 Rigidbody를 움직이는 데 필요한 힘 또는 토크의 양을 정의하지만, 질량은 선형 운동에 영향을 미치는 반면 관성 텐서는 회전 운동에 영향을 미친다.
비활성화하면 텐서에 대한 고유한 X, Y, Z 좌표를 설정할 수 있다.
Inertia Tensor
Rigidbody의 관성 텐서를 정의한다. 값이 높을수록 Rigidbody가 축에서 회전하는 데 더 많은 토크가 필요하다.
Inertia Tensor Rotation
관성 텐서의 회전을 정의한다.
활성화하면 물리 시스템이 게임 오브젝트를 시뮬레이션된 중력 방향(기본값은 Y축 아래)으로 이동시키는 힘을 적용한다.
활성화하면 물리 시스템이 게임오브젝트를 움직이거나 회전하는 데 힘을 가할 수 없으며, 대신 Transform을 통해서만 게임 오브젝트를 움직이고 회전할 수 있다.
Rigidbody 모션이 런타임 시 불안해 보이는 경우 이를 부드럽게 표현하는 두 가지 옵션을 제공한다.
두 옵션 모두 물리 업데이트 사이에 Rigidbody의 포즈(위치 및 회전)을 계산한다.
None
보간이나 외삽을 적용하지 않는다.
Interpolate
이전 두 물리 업데이트에서 Rigidbody의 포즈와 속도를 사용하여 현재 프레임에서 Rigidbody의 포즈를 계산하고 적용한다.
Interpolate는 Extrapolate보다 정확하지만 물리 업데이트 한 번만큼의 시간 지연이 있다.
일반적으로 정확성이 중요한 상황에 가장 적합하다.
예를 들어, 일정한 속도로 움직이고 움직임에 영향을 미치는 다른 물리적 요소가 있는 경우
Extrapolate
이전 물리 업데이트에서 Rigidbody의 포즈와 속도를 사용하고, 다음 물리 업데이트에서 Rigidbody의 포즈를 예측하여 현재 프레임의 포즈를 계산하고 예측한다.
Extrapolate는 원래 위치보다 약간 앞으로 움직이는 것처럼 보이게 하며 약간 부정확할 수 있다.
일반적으로 정확성이 중요하지 않은 상황에 가장 적합하다.
예를 들어, 일정한 속도로 움직이고 움직임에 영향을 미치는 다른 물리적 요소가 없는 경우
물리 시스템이 해당 Rigidbody를 가진 Collider와 다른 Collider 사이의 충돌을 감지하는 방법을 정의한다.
Unity는 Collider 쌍당 하나의 충돌을 생성하고 이 충돌 감지 속성을 기반으로 충돌 감지 방법을 결정한다.
Discrete
씬에서 다른 모든 Collider에 대해 불연속 충돌 검사를 사용한다.
빠르게 움직이는 충돌과 관련되지 않은 경우 적합하다.
Continuous
(Rigidbody가 있는) 동적 Collider에 불연속 충돌 검사를, (Rigidbody가 없는) 정적 Collider에 스위핑 기반 연속 충돌 검사를 사용한다.
정적 Collider와 빠르게 움직이는 충돌과 관련된 경우 적합하다.
Continuous Dynamic
스위핑 기반 연속 충돌 검사를 사용한다. 또한 (Rigidbody가 없는) 정적 Collider에도 연속 충돌 검사를 사용한다. 그 외 다른 Collider에는 불연속 충돌 검사를 사용한다.
빠르게 움직이는 충돌과 관련된 경우 적합하다.
Continuous Speculative
다른 모든 Collider 간에 추측성 연속 충돌 검사를 사용한다. Kinematic 바디를 설정할 수 있는 유일한 CCD 모드이다.
충돌 정확도가 중요하지 않은 경우 적합하다.
Rigidbody의 움직임에 대한 제약 사항을 정의한다.
Freeze Position
월드 좌표계의 x,y,z 축에서 이동하는 Rigidbody를 선택적으로 중지시킨다.
Freeze Rotation
로컬 좌표계의 x,y,z 축에서 회전하는 Rigidbody를 선택적으로 중지시킨다.
Rigidbody가 특정 레이어의 오브젝트와 물리적으로 상호작용 할지를 정의한다.
Include Layers
물리적으로 상호작용 해야 하는 레이어를 지정한다.
Exclude layers
물리적으로 상호작용 하지 말아야 할 레이어를 지정한다.