Collider コンポーネントは、物理衝突のためのオブジェクト形状を定義します。コライダーは目に見えないので、オブジェクトのメッシュと正確に同じ形状にする必要はありません。実際、大ざっぱにあわせた方がゲームではより効率が良く、違いもわかりません。
単純な (プロセッサー負荷の小さい) コライダーを プリミティブ なタイプのコライダーと呼びます。3D には、Box Collider、Sphere Collider、Capsule Collider があります。2D では、2D BoxCollider と 2D CircleCollider を使う事ができます。1 つのオブジェクトに対してこれらのコライダーを何個でも加えて、複合コライダー を作成できます。
位置とサイズを慎重に調整することによって、複合コライダーは、プロセッサーのオーバーヘッドをおさえつつ、オブジェクトの形状をうまく近似することができます。子オブジェクトにコライダーを追加すれば、さらに自由度が上がります (例えば、対応する親オブジェクトのローカル座標に合わせたボックスの回転など)。このような複合コライダーを作成する場合は、階層のルートオブジェクトに設定する Rigidbody コンポーネントは 1 つだけにするべきです。
プリミティブコライダーは、シアー変形では正しく動作しないことに気を付けてください - つまり、Transform 階層で、回転と不ぞろいのスケールをあわせて使用すると、結果的な形状がプリミティブ形状とは一致しなくなります。そのため、プリミティブコライダーではその形状の正確な再現ができません。
ただし、複合コライダーでも正確にできない場合もあります。3D では、Mesh Collider を使用してオブジェクトのメッシュ形状に正確に合わせることができます。2D では、コライダーを Polygon Collider 2D でスプライト形状に完全一致させるとまではいきませんが、その後自由にコライダーの形状を細かく微調整することができます。これらのコライダーはプリミティブタイプよりも遥かにプロセッサー負荷が大きいので、最適なパフォーマンスを維持するために使用を控えてください。また、メッシュコライダーは通常、メッシュコライダーと衝突することはできません (メッシュコライダー同士が接触しても何も起こりません)。メッシュコライダーのインスペクターにある Convex にチェックを入れることでこの問題を回避することができます。これはオリジナルのメッシュのように見えますが任意のアンダーカットで埋められた「凸包」の形状のコライダーが生成されます。この利点は、凸状メッシュが他のメッシュコライダーと衝突 できる という点です。そのため、適切な形状をしたキャラクターが動くときこの機能を使用することができます。ただし、一般に通用するルールは、シーンジオメトリにはメッシュコライダーを使用し、複合プリミティブコライダーを使って移動するオブジェクトの形状にだいたい合わせることです。
コライダーは Rigidbody コンポーネントのないオブジェクトに加えて、シーンにある床、壁など動かない要素を作成することができます。これらは 静的 コライダーと呼ばれます。物理エンジンのパフォーマンスに大きな影響をもたらすので、一般的には、Transform の位置を変更して静的コライダーの位置変更をすべきではありません。Rigidbody を持つオブジェクトのコライダーは、動的コライダーと呼ばれます。静的コライダーは動的コライダーと相互作用できますが、Rigidbody を持っていないので衝突に反応して動くことはありません。
さまざまなコライダータイプの特性や使い方については、上記のリンクのページを参照してください。
コライダーが相互作用する時、それらの表面ではマテリアルの特性をシミュレートする必要があります。例えば、氷上では滑りやすく、ゴムボールは摩擦力が大きく非常に跳ねやすい、というように。衝突中にコライダーの形状は変化しませんが、摩擦や弾力は Physics Materials を使用して設定することが可能です。パラメーターをちょうど良い値にするには、若干のトライアンドエラーが必要になります。例えば、氷のマテリアルの摩擦は 0 (または、とても低い値) ですし、ゴムの摩擦力は高くてほぼ完全な弾性を持っています。さらに詳しいパラメーターについての説明は Physic Material と Physics Material 2D を参照してください。慣習によって、Physic Material の Phisic には s が付いていませんが、Physics Material 2D には s が付いています。
スクリプトのシステムで衝突を検出し OnCollisionEnter
関数を使用してアクションを開始する事ができます。衝突させるのではなく、あるコライダーが他のコライダーの領域に侵入したことを検出したい場合は、物理エンジンを使えば簡単に検出可能です。コライダーを Trigger ( Is Trigger プロパティを使用します) に設定すると、固体オブジェクトとしては動作しなくなり、他のコライダーがすり抜け可能になります。任意のコライダーがトリガーに設定されたコライダーの領域に侵入すると、トリガーはトリガーオブジェクトのスクリプトにある OnTriggerEnter
関数を呼び出します。
衝突が発生したとき物理エンジンはオブジェクトにアタッチされたスクリプトにある特定の関数を呼び出します。衝突イベントに対応するため数ある関数の中から好きなものをコードとして配置することができます。例えば車が障害物にぶつかったときにクラッシュ音を鳴らすというようにです。
衝突が検出された時の最初の物理演算の更新で OnCollisionEnter
関数が呼び出されます。コライダー同士の接触が維持されている間の更新では OnCollisionStay
関数が呼び出され、最終的に、OnCollisionExit
関数がコライダー同士の接触が終わったことを示します。トリガーのコライダーでは類似した OnTriggerEnter
、OnTriggerStay
、OnTriggerExit
関数を飛び出します。2D 物理演算では、例えば OnCollisionEnter2D
というように、関数名に 2D が加えられた同等の関数が存在します。これらの関数の詳細とサンプルコードはスクリプトリファレンスの MonoBehaviour を参照してください。
通常、非トリガー同士の衝突では、最低 1 つのオブジェクトはキネマティックでない Rigidbody (つまり Is Kinematic がオフ) でなければいけない制限があります。もし両方のオブジェクトがキネマティックの Rigidbody である場合 OnCollisionEnter
その他は呼び出されません。トリガー同士の衝突ではこの制限は適用されず、Rigidbody がキネマティックでもそうでなくても、トリガーコライダーに侵入したときに OnTriggerEnter
が呼び出されます。
コライダーは Rigidbody の設定次第で異なった相互作用をします。3 つの重要な設定は Static Collider (Rigidbody がまったくアタッチされていない)、Rigidbody Collider、Kinematic Rigidbody Collider です。
これはコライダーを持ち、Rigidbody を持たないゲームオブジェクトのことを指します。静的コライダーは、レベルのような、常に同じ場所に留まり、動きまわることが無いジオメトリに使用します。Rigidbody オブジェクトは静的コライダーと衝突しますが、静的コライダーを移動させることはできません。
物理エンジンは静的コライダーが決して移動や変更されないことを前提としており、この前提に基づいて有効な最適化を行うことができます。したがって、ゲームプレイ中に静的コライダーを無効/有効にしたり、移動やスケーリングを行なうべきではありません。もし静的コライダーを変更した場合、内部的に物理演算エンジンが再計算を行ない、パフォーマンスが著しく低下する原因になります。さらに悪いことには、変更によりコライダーが定義されない状態のままになり、誤った物理計算が行われる場合があります。例えば、レイキャストが変更された静的コライダーに対し、検出に失敗したり、空間のランダムな位置を検出したりします。さらに移動する静的コライダーが衝突しても Rigidbody は呼び起こされませんし静的コライダーには摩擦は適用されません。これらの理由から Rigidbody がアタッチされているコライダーのみ変更すべきです。もし Rigidbody に影響されず、しかもスクリプトからコライダーオブジェクトを動かしたい場合は、コライダーに Rigidbody をアタッチしないのではなく、Kinematic Rigidbody コンポーネントをアタッチすべきです。
これはコライダーと通常の、キネマティックでない Rigidbody をアタッチしたゲームオブジェクトです。Rigidbody コライダーは物理演算エンジンによって完全にシミュレートされ、スクリプトから適用される衝突や力に反応することができます。それらは他のオブジェクト (静的コライダーも含む) と衝突が可能で、物理エンジンを使用するゲームではもっともよく使用されるコライダーの設定になります。
これは、コライダーとキネマティック Rigidbody (Rigidbody の IsKinematic プロパティを有効にしたもの) をアタッチしたゲームオブジェクトです。Transform コンポーネントの変更によってスクリプトから キネマティック Rigidbody オブジェクトを動かすことが可能ですが、キネマティックでない Rigidbody のように衝突や力を加えて動かすことはできません。キネマティック Rigidbody はたまに動かしたり、無効/有効にするコライダーのために使用しますが、それ以外は静的コライダーのような動作をします。例の 1 つとして、通常、固定された物理的な障害物であるスライドドアですが、必要に応じてドアが開きます。静的コライダーとは異なり、他のオブジェクトと接触するとき、動くキネマティック Rigidbody によって他のオブジェクトに摩擦が生じ、他の Rigidbody が呼び起こされます。
移動しない場合でも、キネマティック Rigidbody は静的コライダーとは異なる動作をします。例えばコライダーにトリガーが設定されているとき、スクリプト内でトリガーイベントを受信するためには Rigidbody を追加する必要があります。トリガーを重力の影響で落下させたくないときや物理エンジンの影響を受けさせたくない場合は Rigidbody の IsKinematic にチェックを入れます。
Rigidbody コンポーネントの動作は IsKinematic プロパティを使う事で、いつでも通常の状態とキネマティックを切り替える事ができます。
切り替えの一般的な例としては、通常アニメーションにしたがって動くキャラクターが、爆発や激しい衝突などによって物理的に放り出されたときの「ラグドール」効果があります。キャラクターの手足にはそれぞれ、デフォルトで IsKinematic が有効な Rigidbody コンポーネントがあります。手足は普段、アニメーションにしたがって動きますが、それらすべての IsKinematic がオフになると、即座に物理演算オブジェクトのように動作します。すると、衝突や爆発のときに自然な手足の動きでキャラクターを吹き飛ばすことができます。
2 つのオブジェクトが衝突するとき、さまざまなスクリプトイベントは衝突するオブジェクトの Rigidbody の設定に応じて発生します。下の表は、どのイベント関数が呼び出されるかをオブジェクトにアタッチされているコンポーネントに基づいて詳細にまとめたものです。組み合わせのいくつかは 2 つのオブジェクトのうち片方にしか影響しませんが、一般的なルールとして物理演算は Rigidbody コンポーネントがアタッチされていないオブジェクトには適用されません。
衝突時に衝突検出が起こり、メッセージが送信されます | ||||||
---|---|---|---|---|---|---|
静的コライダー | Rigidbody コライダー | キネマティック Rigidbody コライダー | 静的 トリガーコライダー | Rigidbody トリガーコライダー | キネマティック Rigidbody トリガーコライダー | |
静的コライダー | サポート | |||||
Rigidbody コライダー | サポート | サポート | サポート | |||
キネマティック Rigidbody コライダー | サポート | |||||
静的 トリガーコライダー | ||||||
Rigidbody トリガーコライダー | ||||||
キネマティック Rigidbody トリガーコライダー |
トリガーメッセージが衝突時に送信されます | ||||||
---|---|---|---|---|---|---|
静的コライダー | Rigidbody コライダー | キネマティック Rigidbody コライダー | 静的 トリガーコライダー | Rigidbody トリガーコライダー | キネマティック Rigidbody トリガーコライダー | |
静的コライダー | サポート | サポート | ||||
Rigidbody コライダー | サポート | サポート | サポート | |||
キネマティック Rigidbody コライダー | サポート | サポート | サポート | |||
静的 トリガーコライダー | サポート | サポート | サポート | サポート | ||
Rigidbody トリガーコライダー | サポート | サポート | サポート | サポート | サポート | サポート |
キネマティック Rigidbody トリガーコライダー | サポート | サポート | サポート | サポート | サポート | サポート |