現実世界の物理では、剛体 (rigid body、リジッドボディ) とは、物理的な力が加わっても変形しない物体を指します。同じ剛体上の任意の 2 点間の距離は、外力がかかっても、ずっと一定のまま変わりません。
移動、重力、衝突、ジョイントなどの物理ベースの動作をシミュレートするには、シーン内の要素を剛体 (リジッドボディ) として設定する必要があります。Unity の PhysX システムでゲームオブジェクトをリジッドボディとして設定するには、そのゲームオブジェクトに Rigidbody コンポーネントを割り当てます。Rigidbody コンポーネントは、API では Rigidbody
クラスで表されます。
Unity の Rigidbody コンポーネントは、ゲームオブジェクトの動きと位置を物理ベースで制御する方法を提供します。Transform プロパティを使用する代わりに、シミュレートされた物理的な力とトルクを使ってゲームオブジェクトを動かし、物理演算エンジンに結果を計算させることができます。
ほとんどの場合においては、リジッドボディを持つゲームオブジェクトは、Transform プロパティではなく Rigidbody プロパティを使用して動かすことが推奨されます。Rigidbody プロパティは物理演算システムから力とトルクを適用し、それよってゲームオブジェクトの Transform が変更されます。それに加えて Transform を直接変更すると、Unity は物理シミュレーションを正しく計算できず、望ましくない動作が発生する可能性があります。これは ジョイント を持つリジッドボディでは特に顕著です。
Unity は、物理ベースの動きをローカルではなくグローバルに処理します。リジッドボディを持つゲームオブジェクトが物理ベースで動く場合、その動きは親ゲームオブジェクトや子ゲームオブジェクトからは独立したものになります。リジッドボディを持つ子ゲームオブジェクトは、初期化の際に親ゲームオブジェクトを使ってローカル位置を定義しますが、Unity は物理ベースの動きをグローバル空間で計算します。
リジッドボディをスクリプトで制御する場合、使用する主なクラスは AddForce
(ゲームオブジェクトに力を加える) と AddTorque
(ゲームオブジェクトにトルクを加える) です。
場合によっては、“物理演算システムによって検出されるが制御はされない” ゲームオブジェクトが必要になることもあります。例えば “コライダー によって検出されるが、動きや位置は Transform で制御される” ゲームオブジェクトが必要な場合などです。
Unity では、物理ベースではない動きを キネマティックモーション (運動学ベースの動き/キネマティックな動き) と呼びます。Rigidbody コンポーネントには Is Kinematic というプロパティがあります。これを有効にすると、添付されたゲームオブジェクトは、“物理ベースではない” と定義され、物理演算エンジンの制御から外されます。これにより、そのゲームオブジェクトを、Transform を使用してキネマティック方式で (Unity の物理シミュレーションの計算に変更をオーバーライドされない形で) 動かせるようになります。
キネマティックなリジッドボディは、物理ベースのリジッドボディゲームオブジェクトに物理ベースの力を加えることができますが、物理ベースの力を受けることはできません。例えば、キネマティックなリジッドボディが物理ベースで動くリジッドボディに衝突してそれを “押す” ことはできますが、物理ベースで動くリジッドボディがキネマティックなリジッドボディを “押す” ことはできません。
ジョイント を使ってキネマティックなリジッドボディをキネマティックでないリジッドボディにアタッチした場合、そのジョイントは、キネマティックなリジッドボディを動かす力を加えることはできません。このジョイントはキネマティックでないリジッドボディしか動かせません。ただし、Transform を使用すれば、キネマティックなリジッドボディを動かすことが可能で、ジョイントは、キネマティックでないリジッドボディのポーズを、ジョイントの制限に合わせて調整することができます。
Sleep Threshold (Project Settings の Physics 設定 参照) より遅い速度で動くリジッドボディは、Unity によって “スリープ” 状態に設定されます (つまり、そのリジッドボディは物理演算システムの物理演算に含まれなくなります)。スリープ状態のリジッドボディは、衝突や力を受けると Unity によって “起こされ”、物理演算に含まれるようになります。
デフォルトでは、Rigidbody コンポーネントのスリープとスリープ解除は自動的に行われます。ただし、この動作は、Rigidbody.Sleep
メソッドと Rigidbody.WakeUp
メソッドを使用してスクリプトで制御することも可能です。
リジッドボディは、物理演算システムではなく Transform の位置に基づいて動いている静的コライダー (つまりリジッドボディを持たないコライダー) の動きや衝突を受けた場合に、スリープ解除に失敗することがあります。これは特に、物理演算システムが静的コライダーを検出できなくなった場合に発生しやすくなります。このような場合は、Rigidbody.WakeUp
を使用して、スリープ状態のリジッドボディを起こすことができます。
PhysX 物理演算システムのスリープ処理の詳細は、NVIDIA PhysX SDK Rigidbody Dynamics ドキュメントの Sleeping セクション を参照してください。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.