Rigidbody を使うと、__ゲームオブジェクト__を物理特性によって制御する事ができるようになります。リジッドボディがフォースやトルクを受けると、オブジェクトはより現実的な動きをします。重力をうけたり、スクリプトを使ってフォースを与えたり、 NVIDIA PhysX 物理エンジンを通して他のオブジェクトの影響を受けるようにするためには、ゲームオブジェクトに Rigidbody を追加する必要があります。
プロパティー | 機能 |
---|---|
Mass | 物体の質量 (Kg 単位) |
Drag | 力によって動く際に、オブジェクトに影響する空気抵抗の大きさ。0 の場合、空気抵抗は 0。無限の場合、オブジェクトは動きを止めます。 |
Linear Drag | トルクによって回転する際に、オブジェクトに影響する空気抵抗の大きさ。0 の場合、空気抵抗は 0。このパラメーターの値を無限に設定するだけでは、オブジェクトの回転を止められないことに注意してください。 |
Use Gravity | 有効にすると、オブジェクトは重力の影響を受けます。 |
Is Kinematic | 有効にすると、オブジェクトは物理エンジンによって駆動されず、その Transform によってのみ操作されます。これは、プラットフォームを移動したい場合や、Hinge Joint を加えたリジッドボディをアニメーション化したい場合に便利です。 |
Interpolate | リジッドボディの動きがぎこちないとき、以下のオプションの 1 つを利用すると改善する場合があります。 |
- None | 補間を適用しない。 |
- Interpolate | 前フレームの Transform にもとづいて Transform をスムージングします。 |
- Extrapolate | 次のフレームの Transform を予測して Transform をスムージングします。 |
Collision Detection | これを使用すると、高速で動くオブジェクトが、衝突を検知せずに他のオブジェクトをすり抜けてしまうことを防ぎます。 |
- Discrete | Discreet (不連続な)衝突判定を、シーン内の他すべてのコライダーに対して使用してください。他のコライダーは、それに対する衝突のテストを行う時に Discreet 衝突判定を使用します。通常の衝突に使用されます(これがデフォルトの値です)。 |
- Continuous | 動的なコライダー(リジッドボディあり)には Discrete (不連続)な衝突、静的なメッシュコライダー(リジッドボディなし)には Continuous (連続)な衝突を適用します。Continuous Dynamic を適用したリジッドボディに対する衝突は、連続的な衝突検知をします。これは Continuous Dynamic を適用したオブジェクトの衝突相手として使用します。(物理演算のパフォーマンスに大きく影響するため、高速なオブジェクトの衝突で問題が出ない場合は Discrete のままにしてください。) |
- Continuous Dynamic | Continuous や Continuous Dynamic 衝突を適用したオブジェクトに対して、連続的な衝突検知を行ないます。静的なメッシュコライダー(リジッドボディなし)にも連続的な衝突を適用します。その他のコライダーについては 不連続な衝突検知を行ないます。高速で動くオブジェクトに使用します。 |
Constraints | リジッドボディの動きに関する制限。 |
- Freeze Position | ワールド座標の選択した軸でリジッドボディの移動を停止します。 |
- Freeze Rotation | ローカル座標の選択した軸でリジッドボディの回転を停止します。 |
Rigidbody を使うと、ゲームオブジェクトを物理エンジンによって制御する事ができます。これにより、よりリアルな衝突や、さまざまな種類のジョイント、その他の素晴らしい挙動が可能になります。リジッドボディにフォースを与えてゲームオブジェクトを操作すると、トランスフォーム コンポーネント を直接調整した場合とは全く異なる挙動になります。一般的には、あるゲームオブジェクトのリジッドボディとトランスフォームの両方を、同時に操作しない方が良いです。どちらか一方だけを操作するようにしてください。
リジッドボディは、外力を利用するという点でトランスフォームの操作と大きく違います。リジッドボディでは、力やトルクを受けることができますが、トランスフォームはできません。トランスフォームでは移動や回転ができますが、物理演算を使った場合と同じようには動きません。実際に試してみると、その顕著な差に気づくでしょう。リジッドボディに力やトルクを加えると、オブジェクトのトランスフォームコンポーネントの位置や回転を実際に変更します。このため、どちら一方だけを使用する必要があります。物理演算を使っている最中にトランスフォームを変更すると、衝突やその他の計算に問題が生じる原因になります。
物理エンジンを使う前に、ゲームオブジェクトにリジッドボディを追加しなくてはなりません。メニューバーの Components->Physics->Rigidbody から、選択したゲームオブジェクトにリジッドボディを追加できます。これにより、ゲームオブジェクトで物理演算を使う準備ができました; 重力を受けると落下し、スクリプトから外力を与えることができるようになりますが、希望通りの動作をさせるためには、さらに コライダー やジョイントを追加する必要があります。
ゲームオブジェクトにリジッドボディが追加されている場合、トランスフォームの親が移動した位置から半分独立して移動します。(トランスフォームの動きだけが同期されます。)親を移動すると、リジッドボディの子はそれを追いかけます。しかし、リジッドボディが追加されてるゲームオブジェクトは重力や衝突イベントとの関係により、落下していきます。
リジッドボディを制御するため、最初にスクリプトを使用して、力やトルクを追加します。AddForce() と AddTorque() をゲームオブジェクトのリジッドボディで呼び出すことでこれを行います。物理特性を使用する際は、ゲームオブジェクトのトランスフォームを直接変えないようにしてください。
一部の状況で、主にラグドール効果を作成する場合に、アニメーションと物理特性間でオブジェクトの制御を切り替える必要があります。このため、リジッドボディには、isKinematic を付けることができます。リジッドボディに isKinematic を付けている場合、衝突や力、physX のその他部分の影響を受けません。Transform コンポーネントを直接操作することで、オブジェクトを制御する必要があります。キネマティック リジッドボディはその他のオブジェクトに影響しますが、これ自体は物理特性の影響を受けません。例えば、キネマティック ゲームオブジェクトに追加されるジョイントは、そこに追加されたその他のリジッドボディを制約し、キネマティック リジッドボディは衝突を通じて、その他のリジッドボディに影響します。
コライダーは、衝突を発生させるために、リジッドボディと、ともに追加する必要のある別のコンポーネントです。2 つのリジッドボディが互いに衝突する場合、両方のゲームオブジェクトにコライダーを追加する必要があります。コライダーのないリジッドボディは、物理特性シミュレーション中に通り抜けます。
「コライダーはリジッドボディの物理特性の境界を定義します」
「 Component->Physics 」メニューでコライダーを追加します。詳細については、個々のコライダーのコンポーネントリファレンスページを参照してください。
複合コライダーはプリミティブなコライダーの組み合わせにより、ひとつのコライダーとしての挙動を示すものです。便利な場面としては複雑なメッシュをコライダーで使用したいが、Mesh Collider を使用できないケースです。複合コライダーを作成する際はコライダーオブジェクトの子オブジェクトを作成し、それからそれぞれの子オブジェクトにプリミティブなコライダーを追加します。これによりそれぞれのコライダーを別々に容易に配置、回転、拡大縮小することができます。これによって、プリミティブなコライダーに加え、凸状のような複雑なコライダーも作成することができます。
上記の図では、ガンモデルのゲームオブジェクトはリジッドボディが追加されており、子オブジェクトとして複数のプリミティブなコライダーを含みます。親のリジッドボディが力により動かされた場合、子コライダーが追従して動きます。プリミティブなコライダーは環境上にあるメッシュコライダーと衝突し、親のリジッドボディは自身に加えられた力の作用、子コライダーがシーン上の他のコライダーと衝突した作用、の双方を加味して軌道が変化します。
メッシュコライダー同士は通常では衝突しませんが、Convex をオンにした場合のみ衝突することができます。良くある方法として、動くすべてのゲームオブジェクトにはプリミティブなコライダーを組み合わせ、動かない背景のオブジェクトにメッシュコライダーを使います。
連続型衝突検知は、高速移動するコライダーが互いにすり抜けないようにする機能です。すり抜けは、一般的な衝突検知 (Discrete) を使用するときに発生します。オブジェクトが、あるフレームでコライダーの片側にあり、次のフレームですでにコライダーを通過している場合に発生することがあります。これを解決するには、高速移動するオブジェクトのリジッドボディで連続型衝突検知を有効にします。衝突検知モードを Continuous に設定し、リジッドボディが静的な (つまり、リジッドボディがない) メッシュコライダーを通過しないようにします。衝突検知モードを Continuous Dynamic に設定する場合も、衝突検知モードが Continuous や Continuous Dynamic に設定されているサポートされた他のリジッドボディを通過することを防げます。 連続型衝突検知は、ボックスコライダー、スフィアコライダー、カプセルコライダーでサポートされています。連続型衝突検知は、オブジェクトで、すり抜けが発生してしまう場合に衝突を検知するためのセーフティネットのようなものです。ただし、物理的に正確な衝突結果が得られるわけではありません。そのため、高速に動くオブジェクトで問題がある場合は、TimeManger インスペクターにある Fixed Timestep の変数を減らしてシミュレーションをより厳密に行うことができます。
ゲームオブジェクトのメッシュのサイズは、リジッドボディの質量よりもはるかに重要です。リジッドボディが期待通りに動作していない場合、ゆっくり移動するか、浮くか、もしくは、正しく衝突しません。Unity のデフォルトの単位スケールは、1 単位 = 1 メートルなので、インポートされたメッシュのスケールは維持され、物理特性計算に適用されます。例えば、倒壊しかけている高層ビルは、積み木で作った塔とはかなり違う形で崩れるため、サイズの異なるオブジェクトを正確なスケールにモデル化する必要があります。
人体をモデリングする場合は、Unity 上で身長が大体 2 メートル前後になっているかどうか、確認してください。デフォルトのキューブと比較すると、オブジェクトが正しいサイズかどうかをチェックする事ができます。 GameObject > 3D Object > Cube を使用すれば、キューブを新規作成できます。キューブの高さはちょうど 1 メートルなので、作成している人体の身長は 2 倍程度になります。
メッシュ自体を調整できない場合、Project View で選択し、メニューバーから Assets->Import Settings… を選択することで、特定のメッシュアセットの均一なスケールを変更できます。ここでは、スケールを変更し、メッシュを再インポートできます。
ゲームオブジェクトを異なるスケールでインスタンス化する必要がある場合は、トランスフォームのスケール軸の値を調整しても大丈夫です。ただしこの場合、オブジェクトのインスタンス化時に物理特性シミュレーションが実行する作業が増えるため、ゲームのパフォーマンスが低下するかもしれません。これは大きな損失にはなりませんが、他の 2 つの方法でスケールを確定する方が効率的です。また、不均一なスケールだと、親子関係のときに予期せぬ動作が生じる場合がある事も覚えておいてください。これらの理由から、モデリングアプリケーションで正しいスケールのオブジェクトを作成するのが、常に最善策となります。