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

Colliders

Collider components define the shape of a GameObject 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. You can add any number of these to a single GameObject to create compound colliders.

Compound colliders

Compound colliders approximate the shape of a GameObject while keeping a low processor overhead. To get further flexibility, you can add additional colliders on child GameObjects. For instance, you can rotate boxes relative to the local axes of the parent GameObject. When you create a compound collider like this, you should only use one Rigidbody component, placed on the root GameObject 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 GameObject’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 cannot 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 GameObjects using compound primitive colliders.

Static colliders

You can add colliders 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. At the opposite, 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 don’t move in response to collisions.

Physics materials

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

トリガー

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

Collision callbacks for scripts

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

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

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

Collider interactions

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

Static Collider

A static collider is a GameObject that has a Collider but no Rigidbody. Static colliders are mostly used for level geometry which always stays at the same place and never moves around. Incoming Rigidbody objects collide with static colliders but don’t move them.

In particular cases, the physics engine optimizes for static colliders that never move. For instance, a vehicle resting on top of a static collider remains asleep even if you move this static collider. You can enable, disable, or move static colliders in runtime without specially affecting the physics engine computation speed. Also, you can safely scale a static Mesh Collider as long as the scale is uniform (not skewed).

Rigidbody Collider

これはコライダーと通常の、キネマティックでない Rigidbody をアタッチしたゲームオブジェクトです。Rigidbody コライダーは物理演算エンジンによって完全にシミュレートされ、スクリプトから適用される衝突や力に反応することができます。それらは他のオブジェクト (静的コライダーも含む) と衝突が可能で、物理エンジンを使用するゲームではもっともよく使用されるコライダーの設定になります。

Kinematic Rigidbody Collider

これは、コライダーとキネマティック Rigidbody (Rigidbody の IsKinematic プロパティーを有効にしたもの) をアタッチしたゲームオブジェクトです。Transform コンポーネントの変更によってスクリプトから キネマティック Rigidbody オブジェクトを動かすことが可能ですが、キネマティックでない Rigidbody のように衝突や力を加えて動かすことはできません。キネマティック Rigidbody はたまに動かしたり、無効/有効にするコライダーのために使用しますが、それ以外は静的コライダーのような動作をします。例の 1 つとして、通常、固定された物理的な障害物であるスライドドアですが、必要に応じてドアが開きます。静的コライダーとは異なり、他のオブジェクトと接触するとき、動くキネマティック Rigidbody によって他のオブジェクトに摩擦が生じ、他の Rigidbody が呼び起こされます。

移動しない場合でも、キネマティック Rigidbody は静的コライダーとは異なる動作をします。例えばコライダーにトリガーが設定されているとき、スクリプト内でトリガーイベントを受信するためには Rigidbody を追加する必要があります。トリガーを重力の影響で落下させたくないときや物理エンジンの影響を受けさせたくない場合は Rigidbody の IsKinematic にチェックを入れます。

Rigidbody コンポーネントの動作は IsKinematic プロパティーを使う事で、いつでも通常の状態とキネマティックを切り替える事ができます。

切り替えの一般的な例としては、通常アニメーションにしたがって動くキャラクターが、爆発や激しい衝突などによって物理的に放り出されたときの「ラグドール」効果があります。キャラクターの手足にはそれぞれ、デフォルトで IsKinematic が有効な Rigidbody コンポーネントがあります。手足は普段、アニメーションにしたがって動きますが、それらすべての IsKinematic がオフになると、即座に物理演算オブジェクトのように動作します。すると、衝突や爆発のときに自然な手足の動きでキャラクターを吹き飛ばすことができます。

Collision action matrix

2 つのオブジェクトが衝突するとき、さまざまなスクリプトイベントは衝突するオブジェクトの Rigidbody の設定に応じて発生します。下の表は、どのイベント関数が呼び出されるかをオブジェクトにアタッチされているコンポーネントに基づいて詳細にまとめたものです。組み合わせのいくつかは 2 つのオブジェクトのうち片方にしか影響しませんが、一般的なルールとして物理演算は Rigidbody コンポーネントがアタッチされていないオブジェクトには適用されません。

衝突時に衝突検出が起こり、メッセージが送信されます
静的コライダー Rigidbody コライダー キネマティック Rigidbody コライダー 静的 トリガーコライダー Rigidbody トリガーコライダー キネマティック Rigidbody トリガーコライダー
静的コライダー   サポート        
Rigidbody コライダー サポート サポート サポート      
キネマティック Rigidbody コライダー   サポート        
静的 トリガーコライダー            
Rigidbody トリガーコライダー            
キネマティック Rigidbody トリガーコライダー            
トリガーメッセージが衝突時に送信されます
静的コライダー Rigidbody コライダー キネマティック Rigidbody コライダー 静的 トリガーコライダー Rigidbody トリガーコライダー キネマティック Rigidbody トリガーコライダー
静的コライダー         サポート サポート
Rigidbody コライダー       サポート サポート サポート
キネマティック Rigidbody コライダー       サポート サポート サポート
静的 トリガーコライダー   サポート サポート   サポート サポート
Rigidbody トリガーコライダー サポート サポート サポート サポート サポート サポート
キネマティック Rigidbody トリガーコライダー サポート サポート サポート サポート サポート サポート
リジッドボディ概要
ジョイント