
Unity物理システムの基本クラスまとめ
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
概要
ゲームエンジンでオブジェクトを現実のように動かしたい時は、物理エンジンを使います。
UnityというゲームエンジンにはUnityEngine.PhysicsModuleというモジュールがありまして、自分のメモでもあり、初めてUnityを触る方に向ける紹介文としてUnityの基本物理をまとめたいと思います。
主要なクラス
- Collider
BoxCollider、CapsuleCollider、SphereColliderなどの親クラスです。
Colliderとこれの子クラスは物と物の衝突を模擬する担当です。 -
Rigidbody
オブジェクトの位置、回転を物理的に模擬するクラス。 -
PhysicMaterial
摩擦係数、弾力係数などを持つ、Colliderに貼り付ける物理材質クラス。 -
Collision
当たったCollider、位置情報を持つぶち当たる情報クラス。
各クラスの主要なパラメーター
まず、Rigidbodyを使う場合、他のオブジェクトに衝突することを検知するため、Colliderは必ず使います。
Rigidbodyあり、Colliderなしの場合、他のオブジェクトを突き抜けます。重力しか効きません(チェックされる場合)。Rigidbodyなし、Colliderありの場合、物理が効かないけど(動かない)、RigidbodyとCollider両方持つオブジェクトにとって静止物となります。
下図を確認してください。

Collider
Colliderというクラスは、物理だけじゃなくて、イベント用のトリガーボリュームとしてもよく使われています。
Is Trigger
チェックすると、イベント用のトリガーボリュームになり、物理的に他のオブジェクトに影響しなくなります。Material (Physic Material)
摩擦係数、弾力係数が設定されるPhysic Materialをセットするスロットです。CenterとSize
Colliderの位置とサイズを調整するパラメーターです。
Rigidbody
Rigidbodyは物理に効く本体です。
Mass
質量のパラメーターです。重ければ重くほど、動かしにくいです。Drag
オブジェクトの抗力です。高ければ高くほど、動かしにくいです。Angular Drag
オブジェクト回転の抗力です。高ければ高くほど、回転しにくくなります。Use Gravity
重力に効くかどうかの設定です。初期状態はチェックされます。Is Kinematic
アニメーションでコントロールするかどうか。初期状態はチェックされていません。チェックすると、物理的に効かず、位置やスピートなどのはアニメーションに従うことになります。Interpolate
オブジェクトの動きをスムーズさせる設定です。InterpolateとExtrapolate二つ選択しがあります。
例えば元々オブジェクトが一秒ずつ動いてます。Interpolateは0.0sと1.0sの間にある0.5sの動きも計算し、動作をスムーズさせることで、Extrapolateは1.5sの動きを予測してから、1.0sの動きをスムーズさせます。Collision Detection
衝突の検知モードするパラメーターです。フレーム毎に物理が計算されていますが、高速で移動しているオブジェクトが物が速すぎるので、比較的に薄い物にぶつかることの計算が間に合わなくて、突き抜けてしまいます。それを防ぐため、検知モードがいくつあります。Dicrete、ContinuousSpeculative、ContinuousDynamicの順番で、検知精度が高くなり、パフォーマンスコストも上がります。Constraints
位置と回転のX、Y、Z軸をチェックしチェック、ロックする(変化させない)ことができます。
上記のパラメーターはインストラクターで編集できますが、速度のRigidbody.velocityはコードで変更てきます。
Physic Material
ColliderのMaterial (Physic Material)に貼り付ける物理材質です。設定されるパラメーターはColliderの表面に反映されます。
Dynamic FrictionとStatic Friction
動的摩擦係数と静的摩擦係数です。Bounciness
弾力係数です。Friction Combine
物に接触する時摩擦力の計算モード(平均値、最小値、最大値、掛け算)Bounce Combine
物に接触する時弾力の計算モード(平均値、最小値、最大値、掛け算)
Collision (Code Only)
ColliderクラスのOnCollisionEnter(Collision)、OnCollisionStay(Collision)、OnCollisionExit(Collision)関数に渡すローカル変数です。
衝突コールバック関数が呼ばれる時渡してくれます。これで衝突した物のCollider、GameObjectなどの情報を確認できます。
最後
以上紹介した物を上手く運用すれば、ゲーム内基本な物理シミュレーションができます。
ただ全体的に注意してもらいたいのは、Unityに二つフレーム更新関数があります。Update()は画像レンダリングのフレーム毎に呼ばれてる関数(フレームレート関連、固定されません)、そしてFixedUpdate()はレンダリングに依存しない、物理専用、決まった頻度で呼ばれる関数です。物理計算などはFixedUpdate()に行うことが推奨されています。FixedUpdate()の頻度初期値は0.02s(毎秒50回、コード上Time.fixedDeltaTimeに反映しています)ですが、Edit -> Project Setting -> Timeに設定できます。







