※Mesh Collider同士は通常では衝突しませんが、Convexをオンにした場合のみ衝突することが出来ます。良くある方法として、動く全てのオブジェクトにはプリミティブなコライダを組み合わせ、動かない背景のオブジェクトにMesh Colliderを使います。
連続衝突検知 / Continuous Collision Detection
連続衝突検知は、高速移動するコライダが互いにすり抜けないようにする機能です。 これは、通常の(「Discrete」) 衝突検知使用時、オブジェクトが 1 つのフレームでコライダの片側にあり、次のフレームでコライダを通過している場合に発生することがあります。 これを解決するには、高速移動するオブジェクトのリジッドボディで連続衝突検知を有効にできます。 衝突検知モードを「Continuous」に切り替え、リジッドボディがスタティックな (つまり、非リジッドボディ) メッシュコライダ を通過させないようにします。 衝突検知モードを「Continuous Dynamic」に切り替え、リジッドボディが、衝突検知モードを「Continuous」または「Continuous Dynamic」に設定したその他のサポートされているリジッドボディを通過させないようにします。 連続衝突検知は、Box、Sphere および Capsule の コライダ でサポートされています。連続衝突検知は、オブジェクトですり抜けが発生してしまう場合に衝突をキャッチするためのセーフティネットが意図する用途ですが、物理的に正確な衝突結果が得られるわけではないため、高速に動くオブジェクトで問題がある場合は、TimeMangerインスペクタにある固定 Time step 変数を減らしてシミュレーションをより厳密に行うことが出来ます。
正しいサイズの使用
GameObject のメッシュのサイズは、リジッドボディの質量よりもはるかに重要です。 リジッドボディが期待通りに動作しなていない場合、ゆっくり移動するか、浮くか、正しく衝突しません。 Unity のデフォルトの単位スケールは、1 単位 = 1 メートルなので、インポートされたメッシュのスケールは維持され、物理特性計算に適用されます。 例えば、倒壊しかけている高層ビルは、積み木で作った塔とはかなり違う形で崩れるため、正確にスケールするには、サイズの異なるオブジェクトをモデル化する必要があります。
メッシュ自体を調整できない場合、Project View で選択し、メニューバーから を選択することで、特定のメッシュ アセットの均一なスケールを変更できます。 ここでは、スケールを変更し、メッシュを再インポートできます。
ゲームで、GameObject を異なるスケールでインスタンス化する必要がある場合、トランスフォームのスケール軸の値を調整しても大丈夫です。 欠点は、物理特性シミュレーションは、オブジェクトのインスタンス化時に更に多くの作業を剃る必要があり、ゲーム内でパフォーマンスの低下を引き起こす可能性があります。 これは大きな損失ではありませんが、他の 2 つのオプションでスケールを仕上げることほど効率的ではありません。 不均一なスケールだと、パレンディング使用時に望まぬ動作を生じる場合があります。 このため、モデリング アプリケーションで正しいスケールでオブジェクトを作成するのが常に最適です。
もしKinematicでないRigidbodyのTransformを直接移動すると、他のオブジェクトと正しく衝突しないかもしれません。その代わりに、Rigidbodyを動かすには、力を加えるか、トルクを加える必要があります。さらにRigidbodyにJoint を加えて複雑な動作も実現することが出来ます。例えば、物理的なドアか、振り子の動作をする鎖のついたクレーンを作成することが出来ます。
さらにはRigidbodyを使用して乗り物に活力を与えて、Rigidbody、四輪のWheel Collider とユーザのInput にもとづいたWheel Forceを加えるスクリプト、などを作成することが出来ます。
スクリプトからRigidbodyを加えることで飛行機を作成することが出来ます。あるいは、様々なJointを追加したり、スクリプトから力を加えることで、特殊な乗り物やロボットを作成することが出来ます。
RigidbodyはPrimitive Collider と組み合わせて使用することが良くあります。
ヒント:
- 親子のRigidbodyを一緒にするべきではありません。
- RigidbodyのScaleをするべきではありません。
Kinematic Rigidbodiy
Kinematic Rigidbody はisKinematicオプションを有効にしたRigidbodyです。Kinematic Rigidbodyは力、重力、コリジョンによる作用を受けません。これらは、明示的にTransformの位置や回転を設定したり、アニメーションできますが、他のKinematic Rigidbodyを相互作用させることが出来ます。Kinematic Rigidbodyは他のRigidbodyと衝突した際にWake Up して、上に乗せられたRigidbodyに摩擦(Friction)を加えます。
次に、Kinematic Rigidbodyの例をいくつか示します:
- オブジェクトに物理挙動を持たせるけれど、別の状況ではアニメーションやスクリプトで制御を明示したい場合がたまにあります。例えばアニメーションするキャラクターを作成して、そのボーンにRigidbodyをアタッチして、ジョイントを接続してRagdollとして使用するとします。ほとんどの場合、キャラクターはアニメーションで制御するので、RigidbodyをKinematicに設定します。しかし、キャラクターが何かに当てられたときはRagdollに変更して、物理挙動を与えるようにします。そのためには、isKinematicプロパティを無効にするだけです。
- 動いているオブジェクトに他のオブジェクトを押すことが出来るようにしたいけど、逆にそれ自身は押されたくない場合がたまにあります。例えば、アニメの土台があり、いくつかのRigidbodyの箱を上に乗せたい場合、土台はRigidbodyのないCollider ではなく、Kinematic Rigidbodyとすべきです。
- Kinematic Rigidbodyにアニメーションを持たせ、本当のRigidbodyに利用可能なジョイントをつけてKinematic Rigidbodyをフォローさせるようにしたい場合があります。
Static Collider
Static Collider はコライダはあるけれどRigidbodyはないゲームオブジェクトです。Static Colliderは同じ場所を保ち不動である階段の物体などで使用されます。すでに存在するグラフィックスのメッシュにMesh Collider を追加(あるいはもっと良い方法として のGenerate Colliders のチェックボックスを有効化)するか、他のコライダのタイプを使用することが出来ます。
物理挙動により影響される (Kinematic でない) コライダは有効化/無効化あるいは変換すべきではありません。Static Colliderの変更はPhysXでの内部計算のやり直しを発生させ、それが高価であるために大きなパフォーマンス低下につながります。ひどい場合にはコライダが仕様が未定義の状態になり、物理計算に不具合を生じさせるかもしれません(例えば変更された Static Collider に対する Raycast によりそれを検知できなかったり、逆に空間上のランダムな地点で検知してしまったりします)。さらにStatic Collider にもとづいて他の Rigidbody をウェイクアップさせる動作は仕様が未定義であり、Static Collider を移動することでそれにタッチした Rigidbody に摩擦が加わりません。これらの理由のため、 Rigidbody であるコライダのみ変更対象とすべきであり、 isKinmatic は true をセットして他のコライダが物理挙動により影響を受けないようにすべきです。
Character Controller
ヒューマノイド型キャラクター作成する場合、Character Controller を使用すべきです。これはアクションゲーム(Third Person Platformer)のメインキャラかもしれないし、FPSの狙撃手や敵キャラかもしれません。
このControllerは不自然な動きになってしまうため、物理法則にしたがいません(Doomでは時速140キロで走って、1フレームで停止して、方向転換することが出来ます)。その代わり、移動するコライダは衝突判定を行って、キャラクターが壁に沿ってスライドして、階段を昇ったり降りたり出来るようになります。
Character ControllerはForceにより作用を受けませんが、Rigidboyにスクリプトから力を加えることで押すことは出来ます。一般に、全てのヒューマノイドキャラクターはCharacter Controllerを使用して実装します。
Character Controllerは物理挙動が継承されないため、もし本当の物理挙動を当てはめたい場合、例えば揺れるロープにつかまったり、大きな岩に押しのけられたり、といった場合、Rigidbodyを使用する必要があります。これにより、キャラクターにJointやForceを使用することが出来ます。Character Controllerは常にY軸と平行の向きであるため、空中で向きを変える必要がある場合(例えば重力が変化する、など)もRigidbodyを使用する必要があります。しかし、キャラクターを不自然でないようにRigidbodyをチューニングするのは、ゲームキャラクターが物理法則に反して動くことを期待されているため難しい、ということを頭に入れるべきです。もう一つの違いは、Character Controllerが決まった階段のステップをスムーズに動くことは出来ますが、Rigidbodyには難しいことです。
もし、Character ControllerをRigidbodyの親とする場合、"Joint" のような動作になります。