リヨスケのチラシ裏

学んだことを書き留めていく自分のための技術メモです。

【Unity】Rigidbody 2DのBody Typeについて

Rigidbody 2DとRigidbodyではInspectorで設定できる内容が大分違ったので調べてみました。

 

Body Type

選択肢が以下の3つあり、どれを選ぶかによってそのあとの設定項目も変わる(増減する)ようです。

  • Dynamic (動的)
    重力などの外部からの力に影響を受ける
    他のどのタイプとのBody Typeとも衝突できる
  • Kinematic (キネマティック)
    Dynamicがうけるような重力や力の影響を受けない
    衝突の検知は物理クエリを使用し、移動はスクリプトを使用する
    衝突はDynamicとのみ発生する(他のKinematicやStaticとは衝突しない)
    力の影響を受けないため、衝突しても動かない
  • Static (静的)
    全く動かないオブジェクトとしてふるまう
    衝突判定はDynamicとのみ発生?

 

Dynamic (動的)

設定できる項目が一番多いBody Typeです。

Unity上で計算される重力などの外部からの力の影響を受けます。重力によって下方向に引っ張られるし、摩擦などの影響も受けます。

当然、他のオブジェクトにぶつかられたりして発生する力の影響も受けます。

 

衝突判定はDynamic、Kinematic、Staticのタイプとも発生します。

ただし、「Simulated」のチェックを外した場合はこれらの力の影響を受けなくなります。

 

Kinematic (キネマティック)

Dynamicで設定できた質量や減衰値、重力などの項目が消えています。

これは、Kinematicが重力などの外部の力の影響を受けないからのようです。

つまりKinematicに設定されたオブジェクトは他のオブジェクトにぶつかられたりしてもびくともしません。

ただ、スクリプトの制御によって動かすことはできます。

 

Rigidbody2DをアタッチせずにCollider2Dをアタッチした静的コライダーをトランスフォームをいじるなどしてうごかそうとすると物理エンジンのパフォーマンスに多大な影響を与えるらしく、非推奨とされています。

Kinematicであればその問題が解決されるというわけですね。

 

衝突判定はDynamicとのみ発生し、他のKinematicやStaticとは発生しません。

外部の力を全く受けず、プレイヤーなど動的なオブジェクトを蹴散らしてでも決められた動きをさせたいときに使えそうです。

「Kinematicだけどすべてのオブジェクトと衝突判定を出したい!」というときには「Use Full Kinematic Contacts」にチェックを入れると可能なようです。

衝突した場合はやはりびくともしない無限の質量を持ったオブジェクトのふるまいをするとのこと。

こちらも「Simulated」の項目はあり、チェックを外した場合は衝突判定は発生しなくなります。

 

Static (静的)

設定できる項目が「Material」と「Simulated」の2つしかありません。

StaicはRigidbody2DをアタッチせずにCollider2Dのみをアタッチした静的コライダーと同じふるまいをします。

つまり、全く動かす気のない足場や障害物などの設定に向いています。

じゃあ静的コライダーとStaticにしたRigidbody2Dの何が違うのかというと、衝突判定というか、Colliderの有効・無効を効率的に切り替えられる点、とのこと。

コスト管理を意識するときにこちらの設定に気を回せるといいみたいですね。

 

 

・・・と、公式リファレンス必死に読んでたけど以下の記事が死ぬほど分かりやすかったです。

tsubakit1.hateblo.jp

もっと早く見つけたかった。。。