Version: 2020.1
言語: 日本語
2D 物理演算リファレンス
Collider 2D

Rigidbody 2D

Rigidbody 2D コンポーネントにより、オブジェクトを物理エンジンで制御することができます。標準の Rigidbody コンポーネントの多くの概念は Rigidbody 2D に引き継がれます。ただし、Rigidbody 2D では、オブジェクトは XY 平面でのみ移動し、この平面に垂直な軸でのみ回転します。

Rigidbody 2D コンポーネントは、選択した Body Type によって Unity エディター内で表示が異なります。詳細は後述の Body Type を参照してください
Rigidbody 2D コンポーネントは、選択した Body Type によって Unity エディター内で表示が異なります。詳細は後述の Body Type を参照してください

Rigidbody 2D の動作

通常は、Unity Editor の Transform コンポーネントによってオブジェクト (とその子オブジェクト) のシーン内の位置、回転、スケールが決まります。Transform コンポーネントが変更されると、他のコンポーネントを更新します。それにより、どこにレンダリングするか、どこにコライダーを置くかなどが更新される場合があります。2D の物理演算エンジンはコライダーを動かし、互いに相互作用させることができます。ですから、物理演算エンジンがコライダーの動きの情報を Transform コンポーネントに返すためのメソッドが必要です。コライダーに関わるこの動きと接点を伝えるために Rigidbody 2D コンポーネントは存在します。

Rigidbody 2D コンポーネントは Transform をオーバーライドし、Rigidbody 2D によって決められた位置/回転へ更新します。Transform コンポーネントを手動で変更することによって Rigidbody 2D をオーバーライドすることもできますが (Unity はすべてのコンポーネントに関するすべてのプロパティを表示するので)、オブジェクトが互いに通り抜けたり、中に入ったり、予期せぬ動きをしたりするなど、問題の原因となることもあります。

オブジェクトや子のオブジェクトに加えた Collider 2D コンポーネントは暗示的に Rigidbody 2D にアタッチされます。Collider 2D が Rigidbody 2D にアタッチされると、一緒に移動します。Collider 2D は 、Transform やコライダーオフセットを使って直接動かされることは決してありません。代わりに、Rigidbody 2D を動かします。こうすることで最良のパフォーマンスを得、正しく衝突を検出できます。1つの Rigidbody 2D にアタッチする複数の Collider 2D は互いに衝突しません。つまり、1つの合成コライダーとして効率的に動くひとまとまりのコライダーを作ることができます。すべてのコライダーがその Rigidbody 2D と同期して動いたり回転したりします。

シーンをデザインするとき、自由にデフォルトの Rigidbody 2D を使い、コライダーをアタッチし始めることができます。これらのコライダーは、他の Rigidbody 2D にアタッチしたコライダーと互いに衝突できます。

ヒント

Rigidbody 2D の追加によりスクリプト API から力を加えてスプライトの動作を見映えのよい物理挙動にできます。さらに、スプライトオブジェクトに適切なコライダーコンポーネントをアタッチすると、他の移動オブジェクトとの衝突を検知します。物理挙動を使用すれば、よくあるゲーム動作の多くを単純化するのみならず、リアルで迫力ある動作を最小限のコーディングで実現できます。

Body Type

Rigidbody 2D コンポーネントの一番上に Body Type という項目があります。この選択によって、このコンポーネントで選択できる他の設定部分が変わります。

Body Type には 3 つ選択肢があります。それぞれ一般的で決められた挙動を定義しています。Rigidbody 2D にアタッチされた Collider 2D はすべて、 Rigidbody 2D の Body Type を継承します。 3 つの選択肢は以下の通りです。

  • Dynamic (動的)
  • Kinematic (キネマティック)
  • Static (静的)

Body Type の選択によって以下が決まります。

  • 移動 (位置と回転) 挙動
  • コライダーの相互作用

Rigidbody 2D はしばしば互いに衝突するように叙述されますが、衝突するのは、各 Rigidbody 2D にアタッチされた Collider 2D だということに注意してください。Rigidbody 2D は、コライダーなしには衝突することはできません。

Rigidbody 2D の Body Type の変更は少し注意が必要な処理です。Body Type を変更すると、さまざまな質量に関する内部プロパティが即座に再計算され、次の FixedUpdate の間に Rigidbody 2D にアタッチされた Collider 2D の既存の接触すべてが再検証されます。その Rigidbody 2D にいくつの接触があり、いくつの Collider 2D がアタッチされているかによって、Body Type の変更によって、パフォーマンスに変化が起こります。

Body Type: Dynamic (動的)

Dynamic (動的な) Rigidbody 2D はシミュレーションで移動するようにデザインされています。それには、シミュレーションに使用できる有限質量や減衰などのプロパティがすべてそろっており、重力や力の影響を受けます。動的な Rigidbody 2D は他のどのボディタイプとも衝突でき、もっともインタラクティブなタイプです。これは、移動する必要がある物体にとってもっとも一般的なボディタイプなので、Rigidbody 2D のデフォルトのタイプです。また、このタイプは、その動的な特質と、周囲のすべてのものと相互作用する性質のため、パフォーマンスに高い負荷のかかるボディタイプでもあります。このボディータイプでは、すべての Rigidbody 2D プロパティが使用可能です。

動的な Rigidbody 2D の位置や回転を設定するために Transform コンポーネントを使用しないでください動的な Rigidbody 2D は、その速度に基づいてシミュレーションによって再配置されます。スクリプトで適用された力をとおして、位置を直接変えたり、衝突と重力によって間接的に変えたりできます。

プロパティ 機能
Body Type RigidBody 2D のコンポーネントを設定し、移動 (位置と回転) 挙動と Collider 2D のインタラクションを操作できます。
選択肢は Dynamic (動的), Kinematic (キネマティック), Static (静的) です。
Material 特定の親 Rigidbody 2D にアタッチされた Collider 2D すべてに、共通のマテリアルを指定します。
注意 Collider 2D は、自体のマテリアルプロパティがある場合には、それを使用します。指定されたマテリアルがこのフィールド、または、Collider 2D にない場合は、デフォルトの選択は None (Physics Material 2D) になります。この場合は、Physics 2D ウインドウでデフォルトのマテリアルを設定して使用します。
Collider 2D は、どの Material 設定を使うのかを以下の優先順位で決定します。
1. Collider 2D で指定された Physics Material 2D
2. アタッチしたRigidbody 2D で指定された Physics Material 2DA
3. Physics 2D ウィンドウで指定された Physics Material 2D デフォルトマテリアル
ヒント このようにして、同じ Static (静的) Body Type Rigidbody 2D にアタッチされたすべての Collider 2D が同じマテリアルを確実に使用できるようににします。
Simulated Simulated を有効に (ボックスをチェック) すると、ランタイムに、Rigidbody 2D とそれにアタッチされたすべての Collider 2D と Joint 2D を物理的シミュレーションと相互作用させます。無効にすると、これらのコンポーネントはシミュレーションと相互作用しません。 詳しくは後述のRigidbody 2D properties: Simulated を参照してください。このボックスはデフォルトではチェックされています。
Use Auto Mass Rigidbody 2D がその 2D コライダーから自動的にゲームオブジェクトの質量を検出するようにしたい場合はこのボックスをチェックします。
Mass Rigidbody 2D の質量。Use Auto Mass を選択している場合は、選択不可。
Linear Drag 位置移動の減衰値。
Angular Drag 回転移動の減衰値。
Gravity Scale ゲームオブジェクトにかかる重力の度合い。
Collision Detection Collider 2D 間の衝突を検知する方法を設定します。
        Discrete Collision DetectionDiscrete (不連続) に設定すると、Rigidbody 2D と Collider 2D を持つゲームオブジェクトの動く速度が十分速い場合は、物理計算の更新の間に、ゲームオブジェクトが、互いに重なったり通り抜けたりすることができます。衝突の接触は新しい位置でのみ発生します。
        Continuous Collision DetectionContinuous (連続) に設定すると、Rigidbody 2D と Collider 2D を持つゲームオブジェクトは、物理計算の更新の間に、互いに重なったり通り抜けたりしません。代わりに、Unity は Collider 2D の最初の衝突位置を計算し、そこにあるゲームオブジェクトを動かします。これは、Discrete よりも CPU で長い時間がかかります。
Sleeping Mode プロセッサー負荷を抑えるために、オブジェクトがスリープするときのモードを設定します。
        Never Sleep スリープを無効にします。(システムのリソースに大きな負荷を与える場合もあるので、可能な限りこの設定は避けるべきです。)
        Start Awake 起動時にオブジェクトを起こす。
        Start Asleep 初期状態でオブジェクトはスリープしていますが、衝突によりスリープが解除されます。
Interpolate 物理計算の更新の合間に、どのようにオブジェクト動作を補間するかを選択します (動きがぎこちないときに役に立ちます)。
        None スムージングを適用しません。
        Interpolate 前フレームでのオブジェクト位置にもとづいて動作をスムージングします。
        Extrapolate 次フレームでのオブジェクト位置の予測にもとづいて動作をスムージングします。
Constraints Rigidbody 2D の動きの制限を設定します。
Freeze Position Rigidbody 2D の動きをワールド空間の X軸と Y軸で選択して停止します。
Freeze Rotation Rigidbody 2D の動きをワールド空間の Z軸で選択して停止します。

Body Type: Kinematic (キネマティック)

Kinematic (キネマティック) Rigidbody 2D はシミュレーションの下で、ただし、とても明確なユーザー制御の下で、動くようにデザインされています。動的なRigidbody 2D は重力と力の影響を受けますが、キネマティック Rigidbody 2D はこれらの影響を受けません。このため、キネマティック Rigidbody 2D は 動的なRigidbody 2D よりもシステムのリソースに負荷をかけません。キネマティック Rigidbody 2D はRigidbody2D.MovePosition または Rigidbody2D.MoveRotation を通して明白に再配置されるようにデザインされています。衝突を検知するには物理クエリを使用し、どこに、どのように Rigidbody 2D を移動するかはスクリプトを使って決定します。

キネマティック Rigidbody 2D は、それでも速度によって動くこともできます。しかし、その速度は力や重力の影響を受けません。キネマティック Rigidbody 2D は他のキネマティック Rigidbody 2D や静的 Rigidbody 2D と衝突しません。動的 Rigidbody 2D だけと衝突します。静的 Rigidbody 2D と同様 (後述を参照)、キネマティック Rigidbody 2D は、衝突の間、動かないオブジェクトのような挙動をします (まるで、無限に大きな質量であるかのように)。このボディタイプには質量に関連したプロパティはありません。

プロパティ 機能
Body Type RigidBody 2D のコンポーネントを設定し、移動 (位置と回転) 挙動と Collider 2D のインタラクションを操作できます。
選択肢は Dynamic (動的), Kinematic (キネマティック), Static (静的) です。
Material 特定の親 Rigidbody 2D にアタッチされた Collider 2D すべてに、共通のマテリアルを指定します。
注意 Collider 2D は、自体のマテリアルプロパティがある場合には、それを使用します。指定されたマテリアルがこのフィールド、または、Collider 2D にない場合は、デフォルトの選択は None (Physics Material 2D) になります。この場合は、Physics 2D ウインドウでデフォルトのマテリアルを設定して使用します。
Collider 2D は、どの Material 設定を使うのかを以下の優先順位で決定します。
1. Collider 2D で指定された Physics Material 2D
2. アタッチしたRigidbody 2D で指定された Physics Material 2DA
3. Physics 2D ウィンドウで指定された Physics Material 2D デフォルトマテリアル
ヒント このようにして、同じ Static (静的) Body Type Rigidbody 2D にアタッチされたすべての Collider 2D が同じマテリアルを確実に使用できるようににします。
Simulated Simulated を有効に (ボックスをチェック) すると、ランタイムに、Rigidbody 2D とそれにアタッチされたすべての Collider 2D と Joint 2D を物理的シミュレーションと相互作用させます。無効にすると、これらのコンポーネントはシミュレーションと相互作用しません。 詳しくは後述のRigidbody 2D properties: Simulated を参照してください。このボックスはデフォルトではチェックされています。
Use Full Kinematic Contacts キネマティック Rigidbody 2D をすべての Rigidbody 2D のボディタイプのものと衝突させたい場合に、これを有効に (ボックスをチェック) します。これは、 動的 Rigidbody 2D に似ています。ただし、キネマティック Rigidbody 2D は他の Rigidbody 2D コンポーネントと接触するときに物理エンジンによって動きません。代わりに、 まるで、無限の重さを持つ動くことがないオブジェクトのような挙動をします。 Use Full Kinematic Contacts が無効の場合は、キネマティック Rigidbody 2D は 動的な Rigidbody 2D とだけ衝突できます。詳しくは後述のRigidbody 2D プロパティの Use Full Kinematic Contacts を参照してください。このボックスはデフォルトではチェックされていません。
Collision Detection Collider 2D 間の衝突を検知する方法を設定します。
        Discrete Collision DetectionDiscrete (不連続) に設定すると、Rigidbody 2D と Collider 2D を持つゲームオブジェクトの動く速度が十分速い場合は、物理計算の更新の間に、ゲームオブジェクトが、互いに重なったり通り抜けたりすることができます。衝突の接触は新しい位置でのみ発生します。
        Continuous Collision DetectionContinuous (連続) に設定すると、Rigidbody 2D と Collider 2D を持つゲームオブジェクトは、物理計算の更新の間に、互いに重なったり通り抜けたりしません。代わりに、Unity は Collider 2D の最初の衝突位置を計算し、そこにあるゲームオブジェクトを動かします。これは、Discrete よりも CPU で長い時間がかかります。
Sleeping Mode プロセッサー負荷を抑えるために、オブジェクトがスリープするときのモードを設定します。
        Never Sleep スリープを無効にします。(システムのリソースに大きな負荷を与える場合もあるので、可能な限りこの設定は避けるべきです。)
        Start Awake 起動時にオブジェクトを起こす。
        Start Asleep 初期状態でオブジェクトはスリープしていますが、衝突によりスリープが解除されます。
Interpolate 物理計算の更新の合間に、どのようにオブジェクト動作を補間するかを選択します (動きがぎこちないときに役に立ちます)。
        None スムージングを適用しません。
        Interpolate 前フレームでのオブジェクト位置にもとづいて動作をスムージングします。
        Extrapolate 次フレームでのオブジェクト位置の予測にもとづいて動作をスムージングします。
Constraints Rigidbody 2D の動きの制限を設定します。
        Freeze Position Rigidbody 2D の動きをワールド空間の X軸と Y軸で選択して停止します。
        Freeze Position Rigidbody 2D の動きをワールド空間の Z軸で選択して停止します。

Body Type: Static (静的)

Static (静的) Rigidbody 2D はシミュレーションの下では全く動かないようにデザインされています。何かがそれに衝突したら、静的なRigidbody 2D は動くことのないオブジェクトのような (まるで限りなく重いもののように) 挙動をします。また、これは、もっともリソースに負担のかからないボディタイプです。静的なRigidbody 2D は 動的 Rigidbody 2D とのみ衝突します。 静的な Rigidbody 2D どおしの衝突は、それらは動くようにデザインされていないためサポートされていません。

このボディタイプでは、かなり限られたプロパティだけが使用可能です。

プロパティ 機能
Body Type RigidBody 2D のコンポーネントを設定し、移動 (位置と回転) 挙動と Collider 2D のインタラクションを操作できます。
選択肢は Dynamic (動的), Kinematic (キネマティック), Static (静的) です。
Material 特定の親 Rigidbody 2D にアタッチされた Collider 2D すべてに、共通のマテリアルを指定します。
注意 Collider 2D は、自体のマテリアルプロパティがある場合には、それを使用します。指定されたマテリアルがこのフィールド、または、Collider 2D にない場合は、デフォルトの選択は None (Physics Material 2D) になります。この場合は、Physics 2D ウインドウでデフォルトのマテリアルを設定して使用します。
Collider 2D は、どの Material 設定を使うのかを以下の優先順位で決定します。
1. Collider 2D で指定された Physics Material 2D
2. アタッチしたRigidbody 2D で指定された Physics Material 2DA
3. Physics 2D ウィンドウで指定された Physics Material 2D デフォルトマテリアル
ヒント このようにして、同じ Static (静的) Body Type Rigidbody 2D にアタッチされたすべての Collider 2D が同じマテリアルを確実に使用できるようににします。
Simulated Simulated を有効に (ボックスをチェック) すると、ランタイムに、Rigidbody 2D とそれにアタッチされたすべての Collider 2D と Joint 2D を物理的シミュレーションと相互作用させます。無効にすると、これらのコンポーネントはシミュレーションと相互作用しません。 詳しくは後述のRigidbody 2D properties: Simulated を参照してください。このボックスはデフォルトではチェックされています。

Rigidbody 2D を 静的 にするには 2 つの方法があります。

  1. ゲームオブジェクトには、Rigidbody 2D コンポーネントを全く持たない Collider 2D コンポーネントを設定することです。そのような Collider 2D はすべて、内的には 1 つの隠れた 静的な Rigidbody 2D コンポーネントにアタッチされているとみなされます。

  2. Rigidbody 2D が設定されているゲームオブジェクトの場合は、その Rigidbody 2D を 静的 に設定します。

1 番目は、 静的な Collider 2D を作成する簡単な方法です。多数の 静的 Collider 2D を作成するには、Collider 2D を持つ各ゲームオブジェクトに Rigidbody 2D を加える必要がないので簡単です。

2 番目は、パフォーマンス上の理由によるものです。静的な Collider 2D を、ランタイムに移動したり再設定する必要がある場合は、Collider 2D 自体の Rigidbody 2D があるほうが、素早く行うことができます。ランタイムに一群の Collider 2D を移動したり再設定する必要がある場合は、各ゲームオブジェクトを個々に動かすよりも、それらの Collider 2D すべてを 静的 に設定した (1 つの) 親の Rigidbody 2D の子にするほうが手早く処理できます。

注意 上にのべたように、静的な Rigidbody 2D は動かないようにデザインされ、交差する 2 つの 静的な Rigidbody 2D オブジェクト間の衝突はサポートされていません。ただし、静的な Rigidbody 2D と キネマティック Rigidbody 2D の場合は、それらに付帯する Collider 2D の 1 つのがトリガに設定されている場合は、互いに相互作用します。また、何に キネマティック Rigidbody が相互作用するかを変える機能もあります。 (詳しくは後述の Use Full Kinematic Contacts を参照してください)。

Rigidbody 2D プロパティ

Simulated

Simulated プロパティを使用すると、 Rigidbody 2D と、アタッチされた Collider 2D と Joint 2D すべてを 2D 物理シミュレーションと相互作用することを無効にしたり有効にしたりできます。このプロパティを変更することは、個々の Collider 2D と Joint 2D コンポーネントを有効/無効にするよりも、ずっとメモリ上、プロセッサ上で効率的です。

Simulation のボックスをチェックすると、以下が発生します。

  • シミュレーションで Rigidbody 2D が動きます (重力と物理的な力が適用されます)。
  • アタッチされた Collider 2D すべてに新しい接触が発生し、継続的に接触が再検証されます。
  • アタッチされた Collider 2D すべてがシミュレーションされ、アタッチされた Rigidbody 2D の動きを限定します。
  • Rigidbody 2D、Collider 2D、Joint 2D のすべての内的な物理オブジェクトはメモリにとどめます。

Simulated のボックスをチェックをはずすと、以下が発生します。

  • シミュレーションで Rigidbody 2D は動きません (重力と物理的な力が適用されません)。
  • Rigidbody 2D に新しい接触は発生せず、アタッチされた Collider 2D の接触はすべて消去されます。
  • アタッチされた Joint 2D はまったくシミュレーションされず、アタッチされた Rigidbody 2D の動きを限定しません。
  • Rigidbody 2D、Collider 2D、Joint 2D のすべての内的な物理オブジェクトをメモリにとどめません。

Simulated を無効にする方が、個々のコンポーネントを制御するよりも効果的な理由

2D 物理演算シミュレーションでは、Rigidbody 2D コンポーネントはアタッチされた Collider 2D コンポーネントの位置と回転を制御します。そして Joint 2D コンポーネントがその位置と回転をアンカーポイントとして使用できるようにします。アタッチされている Rigidbody 2D が移動すると Collider 2D が移動します。それから、Collider 2D は、他の Rigidbody 2D にアタッチされた Collider 2D コンポーネントとの接触を計算します。Joint 2D もまた、Rigidbody 2D の位置と回転を限定します。これらすべてがシミュレーションの消費時間となります。

2D 物理シミュレーションの要素を個々に有効/無効にすることが可能です。これは、Collider 2D と Joint 2D 両方で行うことができます。ただし、物理シミュレーションの個々の要素を有効/無効にすることは、メモリ消費とプロセッサーパワーの負担になります。シミュレーションの要素が無効の場合、2D 物理エンジンは、シミュレーションのための内部的な物理ベースのオブジェクトを生成しません。シミュレーションの要素が有効の場合、2D 物理演算エンジンは、シミュレーションのための内部的な物理ベースのオブジェクトを生成します。2D 物理シミュレーションのコンポーネントを有効/無効にすることは、つまり、ゲームオブジェクトと物理ベースのコンポーネントを生成したり、破棄したりするということです。シミュレーションを無効にすることは、ここのコンポーネントを無効にするよりは、容易で効率的です。

ノート: Rigidbody 2D の Simulated が有効でない場合、アタッチされた Collider 2D は、実際 ‘非表示’ です。つまり、それらは、Physics.Raycast などの、どのような物理クエリからも検出されません。

Use Full Kinematic Contacts

Use Full Kinematic Contacts オプションを有効にすると、キネマティック Rigidbody 2D をすべての Rigidbody 2D ボディタイプと衝突させることができます。これは、動的 Rigidbody 2D に似ています。ただし、キネマティック Rigidbody 2D が他の Rigidbody 2D に接触するとき、物理エンジンで動くわけではなく、それは、無限の質量がある動くことがないオブジェクトのような挙動をします。

このオプションを無効にすると、キネマティック Rigidbody 2D は 動的な Rigidbody 2D のみと衝突します。他の キネマティック Rigidbody 2D や 静的な Rigidbody 2D とは衝突しません (トリガーコライダーは例外です)。つまり、衝突のスクリプトによるコールバック (OnCollisionEnterOnCollisionStayOnCollisionExit) は発生しません。

上記のようなことは、物理クエリ (Physics.Raycast など) を使用して、どこに、どのように Rigidbody 2D を移動するかを検証する場合に不便です。また、複数の キネマティック Rigidbody 2D をそれぞれ、相互作用させる必要がある場合に不便です。 Use Full Kinematic Contacts を有効にすることによって、このように キネマティック Rigidbody 2D コンポーネントを相互作用させることができます。 

Use Full Kinematic Contacts によって、キネマティック Rigidbody 2D の位置と回転を明示的に制御できます。しかも、完全な衝突のコールバックが可能です。すべての Rigidbody 2D を明示的に制御する必要がある場合には、 動的な Rigidbody 2D の代わりに キネマティック Rigidbody 2D を使えば、完全な衝突のコールバックも適用されます。

2D 物理演算リファレンス
Collider 2D