リジッドボディ概要
ジョイント

コライダー

Collider components define the shape of an object for the purposes of physical collisions. A collider, which is invisible, does not need to be the exact same shape as the GameObject’s mesh. A rough approximation of the mesh is often more efficient and indistinguishable in gameplay.

The simplest (and least processor-intensive) colliders are primitive collider types. In 3D, these are the Box Collider, Sphere Collider and Capsule Collider. In 2D, you can use the Box Collider 2D and Circle Collider 2D. Any number of these can be added to a single object to create compound colliders.

Compound colliders

Compound colliders can often approximate the shape of a GameObject well while keeping a low processor overhead. You can get further flexibility by adding additional colliders on child objects; for instance, you can roatae boxes relative to the local axes of the parent object. When you create a compound collider like this, you should only use one Rigidbody component, placed on the root object in the hierarchy.

Primitive colliders do not work correctly with shear transforms. If you use a combination of rotations and non-uniform scales in the Transform hierarchy so that the resulting shape is no longer a primitive shape, the primitive collider cannot represent it correctly.

Mesh colliders

There are some cases, however, where even compound colliders are not accurate enough. In 3D, you can use Mesh Colliders to match the shape of the object’s mesh exactly. In 2D, the Polygon Collider 2D does not match the shape of the sprite graphic perfectly but you can refine the shape to any level of detail you like.

These colliders are much more processor-intensive than primitive types, so use them sparingly to maintain good performance. Also, a mesh collider is unable to collide with another mesh collider (i.e., nothing happens when they make contact). You can get around this in some cases by marking the mesh collider as Convex in the Inspector. This generates the collider shape as a “convex hull” which is like the original mesh but with any undercuts filled in.

The benefit of this is that a convex mesh collider can collide with other mesh colliders so you can use this feature when you have a moving character with a suitable shape. However, a good rule is to use mesh colliders for scene geometry and approximate the shape of moving objects using compound primitive colliders.

Static colliders

Colliders can be added to a GameObject without a Rigidbody component to create floors, walls and other motionless elements of a Scene. These are referred to as static colliders. You should not reposition static colliders by changing the Transform position because this impacts heavily on the performance of the physics engine. Colliders on a GameObject that has a Rigidbody are known as dynamic colliders. Static colliders can interact with dynamic colliders but since they don’t have a Rigidbody, they do not move in response to collisions.

物理マテリアル

コライダーが相互作用する時、それらの表面ではマテリアルの特性をシミュレートする必要があります。例えば、氷上では滑りやすく、ゴムボールは摩擦力が大きく非常に跳ねやすい、というように。衝突中にコライダーの形状は変化しませんが、摩擦や弾力は Physics Materials を使用して設定することが可能です。パラメーターをちょうど良い値にするには、若干のトライアンドエラーが必要になります。例えば、氷のマテリアルの摩擦は 0 (または、とても低い値) ですし、ゴムの摩擦力は高くてほぼ完全な弾性を持っています。さらに詳しいパラメーターについての説明は Physic MaterialPhysics Material 2D を参照してください。慣習によって、Physic Material の Phisic には s が付いていませんが、Physics Material 2D には s が付いています。

トリガー

スクリプトのシステムで衝突を検出し OnCollisionEnter 関数を使用してアクションを開始する事ができます。衝突させるのではなく、あるコライダーが他のコライダーの領域に侵入したことを検出したい場合は、物理エンジンを使えば簡単に検出可能です。コライダーを Trigger ( Is Trigger プロパティーを使用します) に設定すると、固体オブジェクトとしては動作しなくなり、他のコライダーがすり抜け可能になります。任意のコライダーがトリガーに設定されたコライダーの領域に侵入すると、トリガーはトリガーオブジェクトのスクリプトにある OnTriggerEnter 関数を呼び出します。

スクリプトの衝突コールバック

衝突が発生したとき物理エンジンはオブジェクトにアタッチされたスクリプトにある特定の関数を呼び出します。衝突イベントに対応するため数ある関数の中から好きなものをコードとして配置することができます。例えば車が障害物にぶつかったときにクラッシュ音を鳴らすというようにです。

衝突が検出された時の最初の物理演算の更新で OnCollisionEnter 関数が呼び出されます。コライダー同士の接触が維持されている間の更新では OnCollisionStay 関数が呼び出され、最終的に、OnCollisionExit 関数がコライダー同士の接触が終わったことを示します。トリガーのコライダーでは類似した OnTriggerEnterOnTriggerStayOnTriggerExit 関数を飛び出します。2D 物理演算では、例えば OnCollisionEnter2D というように、関数名に 2D が加えられた同等の関数が存在します。これらの関数の詳細とサンプルコードはスクリプトリファレンスの MonoBehaviour を参照してください。

通常、非トリガー同士の衝突では、最低 1 つのオブジェクトはキネマティックでない Rigidbody (つまり Is Kinematic がオフ) でなければいけない制限があります。もし両方のオブジェクトがキネマティックの Rigidbody である場合 OnCollisionEnter その他は呼び出されません。トリガー同士の衝突ではこの制限は適用されず、Rigidbody がキネマティックでもそうでなくても、トリガーコライダーに侵入したときに OnTriggerEnter が呼び出されます。

コライダーの相互作用

コライダーは Rigidbody の設定次第で異なった相互作用をします。3 つの重要な設定は Static Collider (Rigidbody がまったくアタッチされていない)、Rigidbody ColliderKinematic Rigidbody Collider です。

静的コライダー

これはコライダーを持ち、Rigidbody を持たないゲームオブジェクトのことを指します。静的コライダーは、レベルのような、常に同じ場所に留まり、動きまわることが無いジオメトリに使用します。Rigidbody オブジェクトは静的コライダーと衝突しますが、静的コライダーを移動させることはできません。

物理エンジンは静的コライダーが決して移動や変更されないことを前提としており、この前提に基づいて有効な最適化を行うことができます。したがって、ゲームプレイ中に静的コライダーを無効/有効にしたり、移動やスケーリングを行なうべきではありません。もし静的コライダーを変更した場合、内部的に物理演算エンジンが再計算を行ない、パフォーマンスが著しく低下する原因になります。さらに悪いことには、変更によりコライダーが定義されない状態のままになり、誤った物理計算が行われる場合があります。例えば、レイキャストが変更された静的コライダーに対し、検出に失敗したり、空間のランダムな位置を検出したりします。さらに移動する静的コライダーが衝突しても Rigidbody は呼び起こされませんし静的コライダーには摩擦は適用されません。これらの理由から Rigidbody がアタッチされているコライダーのみ変更すべきです。もし Rigidbody に影響されず、しかもスクリプトからコライダーオブジェクトを動かしたい場合は、コライダーに Rigidbody をアタッチしないのではなく、Kinematic Rigidbody コンポーネントをアタッチすべきです。

Rigidbody コライダー

これはコライダーと通常の、キネマティックでない 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 トリガーコライダー
静的コライダー   Y        
Rigidbody コライダー Y Y Y      
キネマティック Rigidbody コライダー   Y        
静的 トリガーコライダー            
Rigidbody トリガーコライダー            
キネマティック Rigidbody トリガーコライダー            
トリガーメッセージが衝突時に送信されます
静的コライダー Rigidbody コライダー キネマティック Rigidbody コライダー 静的 トリガーコライダー Rigidbody トリガーコライダー キネマティック Rigidbody トリガーコライダー
静的コライダー         Y Y
Rigidbody コライダー       Y Y Y
キネマティック Rigidbody コライダー       Y Y Y
静的 トリガーコライダー   Y Y   Y Y
Rigidbody トリガーコライダー Y Y Y Y Y Y
キネマティック Rigidbody トリガーコライダー Y Y Y Y Y Y
リジッドボディ概要
ジョイント