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 | これを選択すると、シーン内のすべてのコライダーに対し Discrete (離散型) 衝突検知を使用します。他のコライダーがこのリジッドボディに対して衝突をテストするときには、離散型衝突検知を行います。一般的な衝突に使用します (デフォルト)。 |
- Continuous | これを選択すると、動的なコライダー (リジッドボディあり) に対しては離散型衝突検知を使用し、静的メッシュコライダー (リジッドボディなし) に対してはスイープに基づく Continuous (連続型) 衝突検知を使用します。Continuous Dynamic (連続型かつ動的) に設定されたリジッドボディは、このリジッドボディに対する衝突のテストには連続型衝突検知を使用します。その他のリジッドボディは、離散型衝突検知を使用します。このオプションは、Continuous Dynamic に設定されたリジッドボディが衝突するオブジェクトに使用します。(この設定は物理演算のパフォーマンスに大きく影響するため、高速なオブジェクトの衝突で問題がない場合は Discrete の設定のままにしてください。) |
- Continuous Dynamic | これを選択すると、Continuous や Continuous Dynamic を適用したゲームオブジェクトに対して、スイープに基づく 連続型衝突検知を行ないます。静的なコライダー (リジッドボディなし) にも連続型衝突検知を適用します。その他のコライダーについては、離散型衝突検知を行ないます。高速で動くオブジェクトに使用します。 |
- Continuous Speculative | これを選択すると、リジッドボディとコライダーに対する投機的な連続衝突検出を使用します。これは、キネマティックなボディを設定できる唯一の CCD モードです。この方法は、スイープに基づく連続衝突検出よりも負荷が少なくなる傾向があります。 |
Constraints | リジッドボディの動きに関する制限。 |
- Freeze Position | ワールド座標の選択した軸でリジッドボディの移動を停止します。 |
- Freeze Rotation | ローカル座標の選択した軸でリジッドボディの回転を停止します。 |
リジッドボディは、ゲームオブジェクトが物理エンジンの制御で動作することを可能にします。これにより、リアリスティックな衝突や様々な種類のジョイントのような挙動が可能になります。リジッドボディに力を加えることによってゲームオブジェクトを操作すると、Transform コンポーネントを直接調整するのとまったく違ったものになります。通常の場合は、同じゲームオブジェクトのリジッドボディと Transform を両方同時に操作することはしないでください。
リジッドボディは、外力を利用するという点で Transform の操作と大きく違います。リジッドボディでは、力やトルクを受けることができますが、Transforms ではできません。Transforms でも移動や回転ができますが、物理演算を使った場合と同じようには動きません。実際に試してみると、その顕著な差に気づくでしょう。リジッドボディに力やトルクを加えると、オブジェクトの Transforms コンポーネントの位置や回転が変わります。これが、どちら一方だけを使用する理由です。物理演算を使っている最中に Transforms を変更すると、衝突やその他の計算に問題が生じる原因になります。
物理エンジンを使う前に、ゲームオブジェクトにリジッドボディを追加しなくてはなりません。メニューバーの Components->Physics->Rigidbody で、選択したゲームオブジェクトにリジッドボディを追加できます。これにより、ゲームオブジェクトで物理演算を使う準備ができました。重力の影響で落下し、スクリプトで外力を与えることができるようになりますが、希望通りの動作をさせるためには、さらに コライダー やジョイントを加える必要があります。
ゲームオブジェクトが物理計算によって制御されている場合、Transform の親の動きから半分独立した動きをします。親を移動すると、リジッドボディの子はそれに追従します。ただし、リジッドボディは重力で落下もすれば、衝突イベントに反応もします。
リジッドボディを制御するには、主にスクリプトを使用して力やトルクを加えます。AddForce() と AddTorque() をゲームオブジェクトのリジッドボディで呼び出すことでこれを行います。物理特性を使用する際は、ゲームオブジェクトの Transform を直接変えないようにしてください。
ある状況で、主にラグドール効果を作成する場合に、アニメーションと物理計算間でオブジェクトの制御を切り替える必要があります。このため、リジッドボディに isKinematic と明示します。リジッドボディが__isKinematic__ と指定されている場合、衝突、力、その他の物理的特性の影響を受けません。つまり、Transform コンポーネントを直接操作することで、オブジェクトを制御する必要があります。キネマティックなリジッドボディはその他のオブジェクトに影響しますが、これ自体は物理特性の影響を受けません。例えば、キネマティックなゲームオブジェクトに設定するジョイントは、そこに追加されたその他のリジッドボディを制約し、キネマティックなリジッドボディは衝突を通じて、その他のリジッドボディに影響します。
コライダーは、衝突を発生させるために、リジッドボディとともに加える必要のあるもう 1 つのコンポーネントです。2 つのリジッドボディが互いに衝突する場合、両方のゲームオブジェクトにコライダーが設定されていないと物理エンジンは衝突を計算できません。コライダーのないリジッドボディは、物理特性シミュレーションで互いにすり抜けてしまいます。
Component->Physics メニューでコライダーを加えます。詳細については、以下の個々のコライダーのコンポーネントのページを参照してください。
複合コライダーはプリミティブなコライダーの組み合わせで、1 つのリジッドボディとして挙動します。正確にシミュレーションを行うにはパフォーマンス面で複雑すぎたり、または負荷が高いモデルがある場合に、単純で似たものを使って適切にその形状の衝突をシミュレーションしたいときに便利です。複合コライダーを作成するには、衝突するオブジェクトの子のオブジェクトを作成します。次に、それぞれの子オブジェクトに 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 つの方法でスケールを確定する方が効率的です。また、不均一なスケールの場合、親子関係に予期せぬ挙動が生じる場合がある事も気に留めておいてください。これらの理由から、モデリングアプリケーションで正しいスケールのオブジェクトを作成するのが、常に最善策となります。
2018–10–12 編集レビュー を行って修正されたページ
追加された投機的な衝突検出メソッドは 2018.3 に追加