現実世界の物理では、剛体 (rigid body、リジッドボディ) とは、物理的な力が加わっても変形しない物体を指します。同じ剛体上の任意の 2 点間の距離は、外力がかかっても、ずっと一定のまま変わりません。
移動、重力、衝突、ジョイントなどの物理ベースの動作をシミュレートするには、シーン内の要素を剛体 (リジッドボディ) として設定する必要があります。Unity の PhysX システムでゲームオブジェクトをリジッドボディとして設定するには、そのゲームオブジェクトに Rigidbody コンポーネントを割り当てます。Rigidbody コンポーネントは API では Rigidbody クラスで表されます。
Unity の Rigidbody コンポーネントは、ゲームオブジェクトの動きと位置を物理ベースで制御する方法を提供します。Transform プロパティを使用する代わりに、シミュレートされた物理的な力とトルクを使ってゲームオブジェクトを動かし、物理演算エンジンに結果を計算させることができます。
ほとんどの場合、ゲームオブジェクトに Rigidbody プロパティがあるときは、Transform プロパティではなく Rigidbody プロパティを使用してゲームオブジェクトを動かします。Rigidbody プロパティは物理演算システムから力とトルクを適用し、ゲームオブジェクトの Transform を変更します。その後、Transform を直接変更すると、物理演算シミュレーションが正しく計算されず、望ましくない動作が発生する可能性があります。これは特に ジョイント を持つリジッドボディに発生します。
Unity は、物理ベースの動きをローカルではなくグローバルに処理します。リジッドボディを持つゲームオブジェクトが物理ベースで動く場合、その動きは親ゲームオブジェクトや子ゲームオブジェクトからは独立したものになります。リジッドボディを持つ子ゲームオブジェクトは、初期化の際に親ゲームオブジェクトを使ってローカル位置を定義しますが、Unity は物理ベースの動きをグローバル空間で計算します。
スクリプトでリジッドボディを制御するための主なクラスは、AddForce (ゲームオブジェクトに力を追加) と AddTorque (ゲームオブジェクトにトルクを適用) です。
場合によっては、物理演算システムによって検出されるが制御はされないゲームオブジェクトが必要になることもあります。例えば、コライダー によって検出されるが動きや位置は Transform で制御されるゲームオブジェクトが必要な場合などです。
Unity では、物理ベースではない動きを キネマティックモーション と呼びます。Rigidbody コンポーネントには Is Kinematic プロパティーがあり、有効にすると、アタッチされたゲームオブジェクトを物理演算ベースではないものとして定義し、物理演算エンジンの制御から外します。これにより、Unity の物理演算シミュレーション計算によって変更をオーバーライドされることなく、Transform を介してキネマティックに動かすことができます。
キネマティックなリジッドボディは、物理ベースのリジッドボディゲームオブジェクトに物理ベースの力を加えることができますが、物理ベースの力を受けることはできません。例えば、キネマティックなリジッドボディが物理ベースで動くリジッドボディに衝突してそれを “押す” ことはできますが、物理ベースで動くリジッドボディがキネマティックなリジッドボディを “押す” ことはできません。
ジョイント を使ってキネマティックなリジッドボディをキネマティックでないリジッドボディにアタッチした場合、そのジョイントは、キネマティックなリジッドボディを動かす力を加えることはできません。このジョイントはキネマティックでないリジッドボディしか動かせません。ただし、Transform を使用すれば、キネマティックなリジッドボディを動かすことが可能です。ジョイントは、キネマティックでないリジッドボディのポーズを、ジョイントの制限に合わせて調整することができます。
Sleep Threshold (Project Settings の Physics を参照) より遅いスピードで動くリジッドボディは、Unity によって “スリープ” 状態に設定されます 。つまり、そのリジッドボディは物理演算システムの物理演算に含まれなくなります。スリープ状態のリジッドボディは、衝突や力を受けると Unity によって “起こされ”、物理演算に含まれるようになります。
デフォルトでは、Rigidbody コンポーネントのスリープとスリープ解除は自動的に行われます。ただし、この動作は、スクリプトから Rigidbody.Sleep メソッドと Rigidbody.WakeUp メソッドを使用して自分で制御することもできます。
リジッドボディは、物理演算システムではなく Transform の位置に基づいて動いている静的コライダー (つまりリジッドボディを持たないコライダー) の動きや衝突を受けた場合に、スリープ解除に失敗することがあります。これは特に、物理演算システムが静的コライダーを検出できなくなった場合に発生しやすくなります。このような場合は、Rigidbody.WakeUp を使用してスリープ状態の Rigidbody をスリープ解除できます。
PhysX 物理演算システムがスリープを処理する方法の詳細については、NVIDIA PhysX SDK Rigidbody Dynamics の スリープ に関するドキュメントを参照してください。