Rigidbody により、ゲームオブジェクト が物理特性の制御下で動作するようになります。リジッドボディは、力やトルクを受け、現実的な方向にオブジェクトを動かすことができます。ゲームオブジェクト は、重力の影響を影響を受けるリジッドボディを含めるか、スクリプトを通じて加えた力の下で動作するか、NVIDIA PhysX 物理特性エンジンを通じて、その他のオブジェクトと相互作用する必要があります。
プロパティー: | 説明: |
---|---|
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 」メニューでコライダーを追加します。詳細については、個々のコライダーのコンポーネントリファレンスページを参照してください。
複合コライダーはプリミティブなコライダーの組み合わせにより、ひとつのコライダーとしての挙動を示すものです。便利な場面としては複雑なメッシュをコライダーで使用したいが、Mesh Collider を使用できないケースです。複合コライダーを作成する際はコライダーオブジェクトの子オブジェクトを作成し、それからそれぞれの子オブジェクトにプリミティブなコライダーを追加します。これによりそれぞれのコライダーを別々に容易に配置、回転、拡大縮小することができます。これによって、プリミティブなコライダーに加え、凸状のような複雑なコライダーも作成することができます。
上記の図では、ガンモデルのゲームオブジェクトはリジッドボディが追加されており、子オブジェクトとして複数のプリミティブなコライダーを含みます。親のリジッドボディが力により動かされた場合、子コライダーが追従して動きます。プリミティブなコライダーは環境上にあるメッシュコライダーと衝突し、親のリジッドボディは自身に加えられた力の作用、子コライダーがシーン上の他のコライダーと衝突した作用、の双方を加味して軌道が変化します。
メッシュコライダー同士は通常では衝突しませんが、Convex をオンにした場合のみ衝突することができます。良くある方法として、動くすべてのゲームオブジェクトにはプリミティブなコライダーを組み合わせ、動かない背景のオブジェクトにメッシュコライダーを使います。
連続衝突検知は、高速移動するコライダーが互いにすり抜けないようにする機能です。これは、通常の(Discrete) 衝突検知を使用するときオブジェクトが、あるフレームでコライダーの片側にあり、次のフレームでコライダーを通過している場合に発生することがあります。これを解決するには、高速移動するオブジェクトのリジッドボディで連続衝突検知を有効にできます。衝突検知モードを Continuous に切り替え、リジッドボディがスタティックな (つまり、リジッドボディを無効化) メッシュコライダーを通過させないようにします。衝突検知モードを Continuous Dynamic に切り替え、他のリジッドボディの衝突検知モードが Continuous や Continuous Dynamic のとき、通過させないようにします。 連続衝突検知は、Box,Sphere,Capsule のコライダーでサポートされています。連続衝突検知は、オブジェクトで、すり抜けが発生してしまう場合に衝突をキャッチするためのセーフティネットのようなものですが、物理的に正確な衝突結果が得られるわけではないため、高速に動くオブジェクトで問題がある場合は、TimeManger インスペクターにあるFixed Timestep の変数を減らしてシミュレーションをより厳密に行うことができます。
ゲームオブジェクトのメッシュのサイズは、リジッドボディの質量よりもはるかに重要です。リジッドボディが期待通りに動作していない場合、ゆっくり移動するか、浮くか、もしくは、正しく衝突しません。Unity のデフォルトの単位スケールは、1 単位 = 1 メートルなので、インポートされたメッシュのスケールは維持され、物理特性計算に適用されます。例えば、倒壊しかけている高層ビルは、積み木で作った塔とはかなり違う形で崩れるため、サイズの異なるオブジェクトを正確なスケールにモデル化する必要があります。
人間をモデリングしている場合、Unity では、その人間の身長は約 2 メートルになります。オブジェクトが正しいサイズかどうかを確認するには、デフォルトのキューブと比較します。GameObject > 3D Object > Cube を使用して、キューブを新規作成します。キューブの高さは、ちょうど 1 メートルになるため、作成している人間は 2 倍の身長になります。
メッシュ自体を調整できない場合、Project View で選択し、メニューバーから Assets->Import Settings… を選択することで、特定のメッシュアセットの均一なスケールを変更できます。ここでは、スケールを変更し、メッシュを再インポートできます。
ゲームオブジェクトを異なるスケールでインスタンス化する必要がある場合、トランスフォームのスケール軸の値を調整しても大丈夫です。欠点は、物理特性シミュレーションは、オブジェクトのインスタンス化時にさらに多くの作業をする必要があり、ゲーム内でパフォーマンスの低下を引き起こす可能性があります。これは大きな損失ではありませんが、他の 2 つのオプションでスケールを仕上げることほど効率的ではありません。不均一なスケールだと、親子関係のときに望まぬ動作が生じる場合があります。このため、常にモデリングアプリケーションで正しいスケールでオブジェクトを作成する必要があります。