UnityのPhysicsについて
UnityのPhysicsについて、RigidbodyだとかColliderだとかisKinematicだとかどう設定すればよいのか理解が浅かったので整理してみました。
Rigidbody
まずはRigidbodyについて。
- オブジェクトに物理挙動を付加するコンポーネント
- オブジェクトの挙動はRigidbodyにより制御されるため、基本的にはTransformプロパティを変更してはいけない(例外あるので後述)
Collider
続いてColliderについて。
- 物理的な衝突を目的としたオブジェクトの形が定義されるコンポーネント
- 目に見えず、オブジェクトのメッシュと同じ形状である必要はない
- 主なものとして、以下の種類のColliderが存在
- Mesh Collider同士は衝突しない
- Mesh ColliderのConvexにチェックを入れると衝突する
Collider + Rigidbodyの組み合わせ
Static Collider
- Colliderのみ持ち、Rigidbodyは持たないゲームオブジェクト
- 常に同じ場所に留まり、動き回ることのないオブジェクトに対して使用する
- ゲームプレイ中に移動、スケーリング等行うと、物理エンジンのパフォーマンスが著しく低下する
Rigidbody Collider
Kinematic Rigidbody Collider
- ColliderとisKinematicにチェックがあるRigidbodyを持つゲームオブジェクト
- Transformコンポーネントの変更により、スクリプトからオブジェクトを動かすことが可能
- ただし、衝突や力を加えて動かす事はできない
- isKinematicプロパティを切り替えることにより、Rigidbody Colliderとして動作させることも可能
衝突時のスクリプトアクション
- 衝突が発生した際には、ゲームオブジェクトにアタッチされているスクリプトに対して、特定の関数を呼び出す
- OnCollisionEnter : 衝突検知時に呼び出される
- OnCollisionStay : 衝突検知中に呼び出される
- OnCollisionExit : 衝突検知終了時に呼び出される
- 衝突する2つのColliderに対して、どちらか一方はisKinematicがオフでなければならないと関数は呼び出されない
呼び出される組み合わせは以下になります。
Static Collider | Rigidbody Collider | Kinematic Rigidbody Collider | |
---|---|---|---|
Static Collider | ○ | ||
Rigidbody Collider | ○ | ○ | ○ |
Kinematic Rigidbody Collider | ○ |
Trigger
- ColliderのisTriggerプロパティをONにする
- すると衝突が発生した際に、Collider同士はすり抜けるようになる
- ColliderがTriggerの空間に侵入した際、Triggerはアタッチされているゲームオブジェクトのスクリプトに対して、特定の関数を呼び出す
- OnTriggerEnter : 接触検知時に呼び出される
- OnTriggerStay : 接触検知中に呼び出される
- OnTriggerExit : 接触検知終了時に呼び出される
呼び出される組み合わせは以下になります。
Static Collider | Rigidbody Collider | Kinematic Rigidbody Collider | Static Trigger Collider | Rigidbody Trigger Collider | Kinematic Rigidbody Trigger Collider | |
---|---|---|---|---|---|---|
Static Collider | ○ | ○ | ||||
Rigidbody Collider | ○ | ○ | ○ | |||
Kinematic Rigidbody Collider | ○ | ○ | ○ | |||
Static Trigger Collider | ○ | ○ | ○ | ○ | ||
Rigidbody Trigger Collider | ○ | ○ | ○ | ○ | ○ | ○ |
Kinematic Rigidbody Trigger Collider | ○ | ○ | ○ | ○ | ○ | ○ |