Mesh Collider
Sphere Collider

Rigidbody

Rigidbody を使うと、__ゲームオブジェクト__を物理特性によって制御する事ができるようになります。リジッドボディがフォースやトルクを受けると、オブジェクトはより現実的な動きをします。重力をうけたり、スクリプトを使ってフォースを与えたり、 NVIDIA PhysX 物理エンジンを通して他のオブジェクトの影響を受けるようにするためには、ゲームオブジェクトに Rigidbody を追加する必要があります。

プロパティー

プロパティー: 説明:
Mass 物体の質量(Kg単位)
Drag 力により動く際に、オブジェクトに影響する空気抵抗の大きさ。0 の場合、空気抵抗が 0 で、無限の場合、オブジェクトは動きを止めます。
Angular Drag トルクにより回転する際に、オブジェクトに影響する空気抵抗の大きさ。0 の場合、空気抵抗なし。このパラメーターの値を無限に設定するだけでは、オブジェクトの回転を止められないことに注意してください。
Use Gravity 有効にすると、オブジェクトは重力の影響を受けます。
Is Kinematic 有効にすると、オブジェクトは物理特性エンジンによって駆動されませんが、その Transform によってのみ操作できます。これは、プラットフォームを移したい場合や、Hinge Joint を追加したリジッドボディをアニメート化したい場合に便利です。
Interpolate Rigidbody の動きがぎこちないとき、次のオプションを試してください。
- 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 ワールド座標系の X、Y、Z 軸で移動するリジッドボディを選択的に停止します。
- Freeze Rotation ローカル座標系の X、Y、Z 軸で回転するリジッドボディを選択的に停止します。

詳細

Rigidbody を使うと、ゲームオブジェクトを物理エンジンによって制御する事ができます。これにより、よりリアルな衝突や、さまざまな種類のジョイント、その他の素晴らしい挙動が可能になります。リジッドボディにフォースを与えてゲームオブジェクトを操作すると、トランスフォーム コンポーネント を直接調整した場合とは全く異なる挙動になります。一般的には、あるゲームオブジェクトのリジッドボディとトランスフォームの両方を、同時に操作しない方が良いです。どちらか一方だけを操作するようにしてください。

リジッドボディは、外力を利用するという点でトランスフォームの操作と大きく違います。リジッドボディでは、力やトルクを受けることができますが、トランスフォームはできません。トランスフォームでは移動や回転ができますが、物理演算を使った場合と同じようには動きません。実際に試してみると、その顕著な差に気づくでしょう。リジッドボディに力やトルクを加えると、オブジェクトのトランスフォームコンポーネントの位置や回転を実際に変更します。このため、どちら一方だけを使用する必要があります。物理演算を使っている最中にトランスフォームを変更すると、衝突やその他の計算に問題が生じる原因になります。

物理エンジンを使う前に、ゲームオブジェクトにリジッドボディを追加しなくてはなりません。メニューバーの Components->Physics->Rigidbody から、選択したゲームオブジェクトにリジッドボディを追加できます。これにより、ゲームオブジェクトで物理演算を使う準備ができました; 重力を受けると落下し、スクリプトから外力を与えることができるようになりますが、希望通りの動作をさせるためには、さらに コライダー やジョイントを追加する必要があります。

親子関係

ゲームオブジェクトにリジッドボディが追加されている場合、トランスフォームの親が移動した位置から半分独立して移動します。(トランスフォームの動きだけが同期されます。)親を移動すると、リジッドボディの子はそれを追いかけます。しかし、リジッドボディが追加されてるゲームオブジェクトは重力や衝突イベントとの関係により、落下していきます。

スクリプト

リジッドボディを制御するため、最初にスクリプトを使用して、力やトルクを追加します。AddForce()AddTorque() をゲームオブジェクトのリジッドボディで呼び出すことでこれを行います。物理特性を使用する際は、ゲームオブジェクトのトランスフォームを直接変えないようにしてください。

アニメーション

一部の状況で、主にラグドール効果を作成する場合に、アニメーションと物理特性間でオブジェクトの制御を切り替える必要があります。このため、リジッドボディには、isKinematic を付けることができます。リジッドボディに isKinematic を付けている場合、衝突や力、physX のその他部分の影響を受けません。Transform コンポーネントを直接操作することで、オブジェクトを制御する必要があります。キネマティック リジッドボディはその他のオブジェクトに影響しますが、これ自体は物理特性の影響を受けません。例えば、キネマティック ゲームオブジェクトに追加されるジョイントは、そこに追加されたその他のリジッドボディを制約し、キネマティック リジッドボディは衝突を通じて、その他のリジッドボディに影響します。

コライダー

コライダーは、衝突を発生させるために、リジッドボディと、ともに追加する必要のある別のコンポーネントです。2 つのリジッドボディが互いに衝突する場合、両方のゲームオブジェクトにコライダーを追加する必要があります。コライダーのないリジッドボディは、物理特性シミュレーション中に通り抜けます。

「コライダーはリジッドボディの物理特性の境界を定義します」

「 Component->Physics 」メニューでコライダーを追加します。詳細については、個々のコライダーのコンポーネントリファレンスページを参照してください。

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

複合コライダー

複合コライダーはプリミティブなコライダーの組み合わせにより、ひとつのコライダーとしての挙動を示すものです。便利な場面としては複雑なメッシュをコライダーで使用したいが、Mesh Collider を使用できないケースです。複合コライダーを作成する際はコライダーオブジェクトの子オブジェクトを作成し、それからそれぞれの子オブジェクトにプリミティブなコライダーを追加します。これによりそれぞれのコライダーを別々に容易に配置、回転、拡大縮小することができます。これによって、プリミティブなコライダーに加え、凸状のような複雑なコライダーも作成することができます。

リアルリティのある複合コライダーの設定
リアルリティのある複合コライダーの設定

上記の図では、ガンモデルのゲームオブジェクトはリジッドボディが追加されており、子オブジェクトとして複数のプリミティブなコライダーを含みます。親のリジッドボディが力により動かされた場合、子コライダーが追従して動きます。プリミティブなコライダーは環境上にあるメッシュコライダーと衝突し、親のリジッドボディは自身に加えられた力の作用、子コライダーがシーン上の他のコライダーと衝突した作用、の双方を加味して軌道が変化します。

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

連続衝突検知

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

正しいサイズの使用

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

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

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

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

ヒント

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