Rigidbody を使うと、ゲームオブジェクト を物理特性によって制御する事ができるようになります。リジッドボディに力やトルクを加えると、オブジェクトをリアリスティックに動かすことができます。重力の影響を加えたり、スクリプトを使って力を与えたり、NVIDIA PhysX 物理エンジンを通して他のオブジェクトと相互作用させるためには、ゲームオブジェクトにリジッドボディを加える必要があります。
プロパティー | 機能 |
---|---|
Mass | 物体の質量 (Kg 単位) |
Drag | 力によって動く際に、オブジェクトに影響する空気抵抗の大きさ。0 の場合、空気抵抗は 0。無限の場合、オブジェクトは動きを止めます。 |
Angular 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 で、選択したゲームオブジェクトにリジッドボディを追加できます。これにより、ゲームオブジェクトで物理演算を使う準備ができました。重力の影響で落下し、スクリプトで外力を与えることができるようになりますが、希望通りの動作をさせるためには、さらに コライダー やジョイントを加える必要があります。
ゲームオブジェクトが物理計算によって制御されている場合、Transform の親の動きから半分独立した動きをします。親を移動すると、リジッドボディの子はそれに追従します。ただし、リジッドボディは重力で落下もすれば、衝突イベントに反応もします。
リジッドボディを制御するには、主にスクリプトを使用して力やトルクを加えます。AddForce() と AddTorque() をゲームオブジェクトのリジッドボディで呼び出すことでこれを行います。物理特性を使用する際は、ゲームオブジェクトの Transform を直接変えないようにしてください。
ある状況で、主にラグドール効果を作成する場合に、アニメーションと物理計算間でオブジェクトの制御を切り替える必要があります。このため、リジッドボディに isKinematic と明示します。リジッドボディが__isKinematic__ と指定されている場合、衝突、力、その他の物理的特性の影響を受けません。つまり、Transform コンポーネントを直接操作することで、オブジェクトを制御する必要があります。キネマティックなリジッドボディはその他のオブジェクトに影響しますが、これ自体は物理特性の影響を受けません。例えば、キネマティックなゲームオブジェクトに設定するジョイントは、そこに追加されたその他のリジッドボディを制約し、キネマティックなリジッドボディは衝突を通じて、その他のリジッドボディに影響します。
コライダーは、衝突を発生させるために、リジッドボディとともに加える必要のあるもう 1 つのコンポーネントです。2 つのリジッドボディが互いに衝突する場合、両方のゲームオブジェクトにコライダーが設定されていないと物理エンジンは衝突を計算できません。コライダーのないリジッドボディは、物理特性シミュレーションで互いにすり抜けてしまいます。
Component->Physics メニューでコライダーを加えます。詳細については、以下の個々のコライダーのコンポーネントのページを参照してください。
複合コライダーはプリミティブなコライダーの組み合わせで、ひとつのコライダーとして挙動します。正確にシミュレーションするにはパフォーマンス面で複雑すぎたり、または負荷が高いモデルがある場合に、単純で似たものを使って適切にその形状の衝突をシミュレーションしたいときに便利です。複合コライダーを作成するには、衝突するオブジェクトの子のオブジェクトを作成します。次に、それぞれの子オブジェクトに 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… を選択することで、メッシュアセットの統一スケールを変更できます。ここでスケールを変更し、メッシュを再インポートできます。
ゲームオブジェクトを異なるスケールでインスタンス化する必要がある場合は、Transform のスケール軸の値を調整しても大丈夫です。ただしこの場合、オブジェクトをインスタンス化するときに物理特性シミュレーションの作業が増えるため、ゲームのパフォーマンスが低下する場合があります。これは大きな問題にはなりませんが、他の 2 つの方法でスケールを確定する方が効率的です。また、不均一なスケールの場合、親子関係に予期せぬ挙動が生じる場合がある事も気に留めておいてください。これらの理由から、モデリングアプリケーションで正しいスケールのオブジェクトを作成するのが、常に最善策となります。