Unityでは手軽に物理演算を適用する事ができます。適用するためにはInspector上から追加したり、スクリプトから追加することもできます。
GameObjectに質量を与える
物理演算を適用するにはいくつかの要素を組み合わせます。まずは3Dモデルに対して質量を与えます。物理学的にはちょっと違いますが、質量とは重さのことです。質量が与えられることにより、重力の影響を受け、衝突を行うことができます。
この質量を扱うのがRigidbodyコンポーネントです。Rigidbodyでは重さの他に、空気抵抗をどれくらい受けるかといったことも設定できます。また、Rigidbodyの性質は維持しつつ、重力の影響を受けないようにすることもできます。
Rigidbodyを追加するためには、Scene上にモデルが存在する場合、対象のモデルに対しInspectorかメニューのComponentからPhysicsの中にあるRigidbodyを選択することで追加できます。
スクリプトから追加する場合は、AddComponent()メソッドを使用します。
1 |
gameObject.AddComponent<Rigidbody> (); |
デフォルトの設定ではMass(重量)が1、Drag(空気抵抗)が0、Angular Drag(回転の空気抵抗)が0.05で設定されています。動かしたい物体の性質によってこの値を変更します。この状態で動作するのは、物体にぶつかることができ、重力の影響を受けて落下し、坂では重量によって加速していくといった動作が行われます。
衝突について
実はRigidbodyでは衝突の判定は行っていません。衝突したかどうかを判定しているのは、Colliderと呼ばれるコンポーネントが担当しています。基本的に3Dモデルを読み込んだ時点でColliderはモデルに対して自動で付属されることが多いですが、まれに追加されていなかったり、チェックボックスがオフになっていたりすると、衝突判定が行われずにすり抜けてしまうといったことがおきます。
Colliderは種類によってある程度の形が指定されています。例えば、Box Colliderであれば立方体に、Sphere Colliderだと球体状だったり、Mesh ColliderならオブジェクトのMeshにそったColliderが付与されます。
跳ね返り
物理演算で質量の他に、もうひとつ重要なのが跳ね返り係数です。質量を追加しただけでは、物体と衝突したときに跳ね返らずに止まってしまいます。
オブジェクトが衝突した際に跳ね返らせるには、オブジェクトのColliderにPhysic Materialを追加することで跳ね返らせることができます。Physic Materialは跳ね返りだけでなく、摩擦も扱っています。RigidbodyとPhysic Materialを追加することで基本的な動きが再現されるようになります。
Physic Materialのパラメータはこのようになっています。
- ・Dynamic Friction
- 移動中に動作する摩擦係数。1に近づくほど摩擦力が大きくなる。
- ・Static Friction
- 静止している時に動作する摩擦係数。1に近づくほど摩擦力が大きくなる。
- ・Bounciness
- 跳ね返り係数。1に近づくほど大きくなり、1はエネルギーの損卒なしで跳ね返る。
- ・Friction Combine
- 触れ合っているオブジェクトが両方共摩擦を持っている場合、どのように摩擦を扱うのか。
- ・Bounce Combine
- 触れ合ったオブジェクトが両方共跳ね返り係数を持っている場合、どのように跳ね返りを行うのか。
動かしてみる
Rigidbodyを持ったオブジェクトを動かすには、自分が操作するプレイヤーであればTranslate等で移動させてもいいですが、他のオブジェクトであれば移動の計算を自分で書かないで、Unityの物理演算に任せてしまったほうが動きとしてはリアルになります。そこでRigidbodyのオブジェクトを動かすには、AddForce()メソッドやAddTorque()メソッドを使用して力を加えて動かします。
AddForce()メソッドは、引数にそれぞれどれくらいの力を加えるかを指定すると、その方向に対して力が加えられ移動しようとします。
1 |
gameObject.AddForce(10, 0, 5, ForceMode.Force); |
この場合、X軸に対して10、Z軸に対して5の力が加えられます。FoceM0deは力を加える際、どのように力を加えるのかを設定します。主に質量を使用するかと力を加えるのが瞬間的か連続的かの違いです。ちなみにAddTorque()メソッドは回転の力を加えます。
終わりに
今回はオブジェクトに物理演算を適用する内容を書いていきました。ここで行っている物理演算は高校物理レベルの内容なので、あーそういえばそんなのやったなーと思い出したりしました。計算自体はUnityがやってくれるので、パラメータのどこをいじればどんなふうに動くのかだけわかればそこまで難しくないと思います。
次回はこの物理演算を適用させて動かした時の衝突判定を検知したいと思います。
では、また。