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