Colliderコンポーネントは物理的な衝突を目的としたオブジェクトの形を定義します。コライダーは目に見えることはなく,オブジェクトのメッシュと同じ形状である必要はありません。これは概算ですが多くの場合,ゲームプレイ中でメッシュと異なる形状ということ見分けがつかなく,さらに異なる形状ということで効率的になる可能性があります。それは最もシンプルな(そしてプロセッサー負荷が最も少ない)コライダーと,もうひとつはいわゆる プリミティブ コライダータイプです。3DではBox Collider, Sphere Collider, Capsule Colliderがあります。2Dでは,Box Collider 2D,Circle Collider 2Dを使用することが出来ます。1つのオブジェクトに任意の数コライダーを追加して 複合コライダー を作成することが出来ます。位置と大きさに気をつけると複合コライダーは低いプロセッサーのオーバーヘッドを維持しながら非常にうまくオブジェクトの形状に近づかせることが出来ます。さらに,子オブジェクトに追加のコライダーを持たせることで柔軟に対応することが出来ます(例えばボックスは親オブジェクトのローカル軸に対して回転することが出来ます)。しかしながら複合コライダーにはRigidbodyは1つのみアタッチするべきで,さらにルートにアタッチするべきです。
しかしながら,複合コライダーでさえ十分に正確にできないケースがいくつかあります。3Dでは,コライダーをMesh Collidersを使用してオブジェクトのメッシュ形状に合わせることが出来ます。2Dでは,コライダーをPolygon Collider 2Dでスプライト形状に完全一致させるとまではいきませんが,その後自由にコライダーの形状を細かく洗練することが出来ます。これらのコライダーはプリミティブタイプよりも遥かにプロセッサー負荷が大きいですが,最適なパフォーマンスを維持するために控え目に使用してください。また,メッシュコライダーは通常,メッシュコライダーと衝突することは出来ません(メッシュコライダー同士が衝突しても何も起こりません)。メッシュコライダーのインスペクターにあるConvexにチェックを入れることでこの問題を回避することが出来ます。これはオリジナルのメッシュのように見えますが任意のアンダーカットで埋められた “凸包” の形状のコライダーが生成されます。この利点は,凸メッシュは他のメッシュコライダーと衝突 できる という点で,適切な形状をしたキャラクターが動くときこの機能を使用することが出来ます。ですが,最適な一般ルールは,シーンジオメトリのメッシュコライダーを使用し,複合プリミティブコライダーを使用して移動するオブジェクトの形状に近づかせることです。
コライダーはRigidbodyコンポーネントをオブジェクトに追加することなくシーンにある床,壁など動かない要素を作成することが出来ます。これらは静的コライダーと呼ばれます。一般的には静的コライダーのTransformの位置の変更は物理エンジンのパフォーマンスに大きな影響をもたらすのでやめるべきです。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物理では, 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 プロパティを有効にしたもの)をアタッチしたゲームオブジェクトです。Transformコンポーネントの変更によってスクリプトからKinematic Rigidbodyオブジェクトを動かすことが可能ですが非Kinematic Rigidbodyのように衝突や力を加えて動かすことは出来ません。Kinematic Rigidbodyは時々動かしたり無効/有効にするコライダーのために使用しますが静的コライダーのような動作をしなければいけません。例えば通常固定された物理的な障害物にすべきスライドドアですが必要に応じてドアを開かなければいけません。静的コライダーとは異なりKinematic Rigidbodyを動かすことにより他のオブジェクトに摩擦が生じ,他のRigidbodyにぶつかった時呼び起こされます。
不動である場合でも,Kinematic Rigidbodyは静的コライダーとは異なる動作をします。例えばコライダーにトリガーが設定されているときスクリプト内でトリガーイベントを受信するためにはRigidbodyを追加する必要があります。トリガーを重力の影響で落下させたくない時や物理の影響を受けさせたくない場合はRigidbodyの IsKinematic にチェックを入れます。
Rigidbodyコンポーネントはいつでも IsKinematic プロパティを使用して通常とKinematicの動作を切り替えることが出来ます。よくある例としてはキャラクターは通常アニメーションによって動きますが爆発や大きな衝突が起こった時,ラグドール効果を与えることです。キャラクターの手足はそれぞれデフォルトで IsKinematic を有効にしたRigidbodyコンポーネントをアタッチすることが出来ます。手足は 全ての 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 | ○ | ○ | ○ | ○ | ○ | ○ |