Mesh Collider
Sphere Collider

Rigidbody

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 を適用したオブジェクトに対して、連続型衝突検知を行ないます。静的なメッシュコライダー (リジッドボディなし) にも連続型衝突検知を適用します。その他のコライダーについては、離散型衝突検知を行ないます。高速で動くオブジェクトに使用します。
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 メニューでコライダーを加えます。詳細については、以下の個々のコライダーのコンポーネントのページを参照してください。

  • Box Collider - キューブのプリミティブな形状
  • Sphere Collider - スフィアのプリミティブな形状
  • Capsule Collider - カプセルのプリミティブな形状
  • Mesh Collider - ゲームオブジェクトのメッシュからコライダーを作成しますが、メッシュコライダーとは衝突できません
  • Wheel Collider - 特に、車両やその他の移動する乗り物用
  • Terrain Collider - Terrain との衝突を処理します

複合コライダー

複合コライダーはプリミティブなコライダーの組み合わせで、ひとつのコライダーとして挙動します。正確にシミュレーションするにはパフォーマンス面で複雑すぎたり、または負荷が高いモデルがある場合に、単純で似たものを使って適切にその形状の衝突をシミュレーションしたいときに便利です。複合コライダーを作成するには、衝突するオブジェクトの子のオブジェクトを作成します。次に、それぞれの子オブジェクトに Collider コンポーネントを加えます。これにより、個々のコライダーを容易に配置、回転、スケールすることができます。複合コライダーは多くのプリミティブなコライダーや、凸状メッシュコライダーから作成できます。

実際の複合コライダーの設定
実際の複合コライダーの設定

上記の図では、ガンモデルのゲームオブジェクトにはリジッドボディがアタッチされ、子ゲームオブジェクトとして複数のプリミティブなコライダーが設定されています。親のリジッドボディが力で動かされた場合、子コライダーは追従して動きます。プリミティブな形状のコライダーは環境上にあるメッシュコライダーと衝突し、親のリジッドボディの動きは、それ自体に加えられた力の作用と、その子コライダーがシーン上の他のコライダーと衝突した作用の双方によって変化します。

メッシュコライダーどうしは通常では衝突しませんが、Convex をオンにした場合のみ衝突することができます。よくある方法として、動くゲームオブジェクトにはプリミティブなコライダーを組み合わせ、動かない背景のオブジェクトにメッシュコライダーを使います。

連続型衝突検知

連続型衝突検知は、高速移動するコライダーが互いにすり抜けないようにする機能です。これは、通常の (Discrete) 衝突検知を使用するときに発生します。オブジェクトが、あるフレームでコライダーの片側にあり、次のフレームですでにコライダーを通過している場合に発生することがあります。これを解決するには、高速移動するオブジェクトのリジッドボディで連続型衝突検知を有効にします。衝突検知モードを Continuous に設定し、リジッドボディが静的な (つまり、リジッドボディがない) メッシュコライダーを通過しないようにします。衝突検知モードを Continuous Dynamic に設定する場合も、衝突検知モードが ContinuousContinuous Dynamic に設定されているサポートされた他のリジッドボディを通過することを防げます。 連続型衝突検知は、ボックスコライダー、スフィアコライダー、カプセルコライダーでサポートされています。連続型衝突検知は、オブジェクトで、すり抜けが発生してしまう場合に衝突を検知するためのセーフティネットのようなものです。ただし、物理的に正確な衝突結果が得られるわけではありません。そのため、高速に動くオブジェクトで問題がある場合は、TimeManger インスペクターにある Fixed Timestep の変数を減らしてシミュレーションをより厳密に行うことができます。

正しいサイズの使用

ゲームオブジェクトのメッシュのサイズは、リジッドボディの質量よりもはるかに重要です。リジッドボディが期待通りに動作していない場合 (移動が遅い、浮いている、正しく衝突しない、など)、メッシュアセットのスケールを調整することも一案です。Unity のデフォルトのユニットは、1 ユニット = 1 メートルです。そのため、インポートされたメッシュのスケールは維持され、物理特性計算に適用されます。例えば、高層ビルの倒壊は、積み木で作った塔とはかなり違う形で崩れるため、サイズの異なるオブジェクトは正確なスケールでモデリングする必要があります。

人体をモデリングする場合は、Unity 上で身長が大体 2 メートル前後になっているかを確認してください。デフォルトのキューブと比較すると、オブジェクトが正しいサイズかどうかをチェックする事ができます。 GameObject > 3D Object > Cube を選択して、キューブを新規作成できます。キューブの高さはちょうど 1 メートルなので、作成している人体の身長は 2 倍程度になります。

メッシュ自体を調整できない場合、特定のメッシュアセットを Project View で選択し、メニューバーから Assets->Import Settings… を選択することで、メッシュアセットの統一スケールを変更できます。ここでスケールを変更し、メッシュを再インポートできます。

ゲームオブジェクトを異なるスケールでインスタンス化する必要がある場合は、Transform のスケール軸の値を調整しても大丈夫です。ただしこの場合、オブジェクトをインスタンス化するときに物理特性シミュレーションの作業が増えるため、ゲームのパフォーマンスが低下する場合があります。これは大きな問題にはなりませんが、他の 2 つの方法でスケールを確定する方が効率的です。また、不均一なスケールの場合、親子関係に予期せぬ挙動が生じる場合がある事も気に留めておいてください。これらの理由から、モデリングアプリケーションで正しいスケールのオブジェクトを作成するのが、常に最善策となります。

ヒント

  • 2 つのリジッドボディの相対的な Mass は、リジッドボディが互いに衝突する際に、どのように反応するかを決定します。
  • 1 つのリジッドボディの Mass を他方より大きくしても、自由落下での落下速度は上がりません。これを行うには、 Drag を使用します。
  • Drag 値が低いと、オブジェクトが重く見えるようになります。この値が高いと、軽く見えます。 Drag の通常の値は、.001 (金属の塊) と 10 (羽) の間です。
  • オブジェクトの Transform コンポーネントを直接操作しているときに物理特性が必要な場合は、オブジェクトにリジッドボディをアタッチし、キネマティックにします。
  • Transform コンポーネントを通じて、ゲームオブジェクトを動かすときに衝突やトリガーメッセージを受信したい場合は、動かすオブジェクトにリジッドボディを加える必要があります。
  • Angular Drag の値を無限に設定するだけでは、オブジェクトの回転を止めることは出来ません。
Mesh Collider
Sphere Collider