Unity物理システムの基本クラスまとめ

Unity物理システムの基本クラスのまとめです

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

概要

ゲームエンジンでオブジェクトを現実のように動かしたい時は、物理エンジンを使います。
UnityというゲームエンジンにはUnityEngine.PhysicsModuleというモジュールがありまして、自分のメモでもあり、初めてUnityを触る方に向ける紹介文としてUnityの基本物理をまとめたいと思います。

主要なクラス

  • Collider
    BoxColliderCapsuleColliderSphereColliderなどの親クラスです。
    Colliderとこれの子クラスは物と物の衝突を模擬する担当です。

  • Rigidbody
    オブジェクトの位置、回転を物理的に模擬するクラス。

  • PhysicMaterial
    摩擦係数、弾力係数などを持つ、Colliderに貼り付ける物理材質クラス。

  • Collision
    当たったCollider、位置情報を持つぶち当たる情報クラス。

各クラスの主要なパラメーター

まず、Rigidbodyを使う場合、他のオブジェクトに衝突することを検知するため、Colliderは必ず使います。

  • Rigidbodyあり、Colliderなしの場合、他のオブジェクトを突き抜けます。重力しか効きません(チェックされる場合)。
  • Rigidbodyなし、Colliderありの場合、物理が効かないけど(動かない)、RigidbodyCollider両方持つオブジェクトにとって静止物となります。

下図を確認してください。

Collider

Colliderというクラスは、物理だけじゃなくて、イベント用のトリガーボリュームとしてもよく使われています。

  • Is Trigger
    チェックすると、イベント用のトリガーボリュームになり、物理的に他のオブジェクトに影響しなくなります。
  • Material (Physic Material)
    摩擦係数、弾力係数が設定されるPhysic Materialをセットするスロットです。
  • CenterSize
    Colliderの位置とサイズを調整するパラメーターです。

Rigidbody

Rigidbodyは物理に効く本体です。

  • Mass
    質量のパラメーターです。重ければ重くほど、動かしにくいです。
  • Drag
    オブジェクトの抗力です。高ければ高くほど、動かしにくいです。
  • Angular Drag
    オブジェクト回転の抗力です。高ければ高くほど、回転しにくくなります。
  • Use Gravity
    重力に効くかどうかの設定です。初期状態はチェックされます。
  • Is Kinematic
    アニメーションでコントロールするかどうか。初期状態はチェックされていません。チェックすると、物理的に効かず、位置やスピートなどのはアニメーションに従うことになります。
  • Interpolate
    オブジェクトの動きをスムーズさせる設定です。InterpolateExtrapolate二つ選択しがあります。
    例えば元々オブジェクトが一秒ずつ動いてます。Interpolate0.0s1.0sの間にある0.5sの動きも計算し、動作をスムーズさせることで、Extrapolate1.5sの動きを予測してから、1.0sの動きをスムーズさせます。
  • Collision Detection
    衝突の検知モードするパラメーターです。フレーム毎に物理が計算されていますが、高速で移動しているオブジェクトが物が速すぎるので、比較的に薄い物にぶつかることの計算が間に合わなくて、突き抜けてしまいます。それを防ぐため、検知モードがいくつあります。DicreteContinuousSpeculativeContinuousDynamicの順番で、検知精度が高くなり、パフォーマンスコストも上がります。
  • Constraints
    位置と回転のX、Y、Z軸をチェックしチェック、ロックする(変化させない)ことができます。

上記のパラメーターはインストラクターで編集できますが、速度のRigidbody.velocityはコードで変更てきます。

Physic Material

ColliderMaterial (Physic Material)に貼り付ける物理材質です。設定されるパラメーターはColliderの表面に反映されます。

  • Dynamic FrictionStatic Friction
    動的摩擦係数と静的摩擦係数です。
  • Bounciness
    弾力係数です。
  • Friction Combine
    物に接触する時摩擦力の計算モード(平均値、最小値、最大値、掛け算)
  • Bounce Combine
    物に接触する時弾力の計算モード(平均値、最小値、最大値、掛け算)

Collision (Code Only)

ColliderクラスのOnCollisionEnter(Collision)OnCollisionStay(Collision)OnCollisionExit(Collision)関数に渡すローカル変数です。
衝突コールバック関数が呼ばれる時渡してくれます。これで衝突した物のColliderGameObjectなどの情報を確認できます。

最後

以上紹介した物を上手く運用すれば、ゲーム内基本な物理シミュレーションができます。

ただ全体的に注意してもらいたいのは、Unityに二つフレーム更新関数があります。Update()は画像レンダリングのフレーム毎に呼ばれてる関数(フレームレート関連、固定されません)、そしてFixedUpdate()はレンダリングに依存しない、物理専用、決まった頻度で呼ばれる関数です。物理計算などはFixedUpdate()に行うことが推奨されています。FixedUpdate()の頻度初期値は0.02s(毎秒50回、コード上Time.fixedDeltaTimeに反映しています)ですが、Edit -> Project Setting -> Timeに設定できます。