ここでは物理演算の主役的な機能であるリジッドボディ(Rigidbody)の使い方を説明します。
※この記事で使用しているUnityのバージョン:Unity2019.1
リジッドボディ(Rigidbody)とは
リジッドボディはゲームオブジェクトを物理演算で動かす際に使うコンポーネントです。もう少し詳しく言うにはUnityマニュアルの説明が一番良いので引用すると
Rigidbody (リジッドボディ) はオブジェクトに物理挙動を可能にするためのメインコンポーネントです。リジッドボディを加えた瞬間から、オブジェクトは重力の影響を受けるようになります。さらに、1つ以上の Collider (コライダー) コンポーネントを加わえれば、オブジェクトは衝突の影響によって動くようになります。
とのことです。つまり、リジッドボディをアタッチしたゲームオブジェクトは
- 重力などの力の影響を受ける
- コライダーに対して衝突判定が行われる
というわけですね。ゲームではキャラクターを動かすときなどに非常に役に立つコンポーネントです。
リジッドボディの使い方
それではリジッドボディコンポーネントの使い方を見ていきましょう。
リジッドボディを使うための準備
まず、リジッドボディを使うためにはちょっとした下準備が必要です。リジッドボディコンポーネントをつけるゲームオブジェクトには、あらかじめ何かしらのコライダーをアタッチしておいてください。そうしないと衝突判定が行われずゲームオブジェクトがすり抜けてしまうので注意です。
なお、コライダーについては「コライダー(Collider)の種類について」をご覧ください。
リジッドボディコンポーネントの設定項目について
そうしたらリジッドボディをゲームオブジェクトにアタッチします。このとき、
- 3D用のコライダーがついたゲームオブジェクトには3D用のリジッドボディ
- 2D用のコライダーがついたゲームオブジェクトには2D用のリジッドボディ
しかつけられないので注意してください(一つのゲームオブジェクト内で共存はできません)。
3D・2Dそれぞれのリジッドボディの設定項目については次の通りです。
3D用リジッドボディの設定項目
項目 | 機能 |
質量 | 物体の質量(kg) |
抗力 | 力によって動くときの空気抵抗 |
角抗力 | 回転によって動くときの空気抵抗 |
Use Gravity | 重力の影響を受けるかどうか |
Is Kinematic | 物理演算の影響を受けないかどうか |
補完 | 動きを補完して滑らかにするか |
衝突判定 | 衝突の検知方法 |
Constraints | 位置や座標を固定するかどうか |
これだけだとよく分からない項目があるのでいくつか補足しておきます。
Is Kinematic
この項目のチェックをONにすると物理演算の影響を受けなくなります。なんでこんな項目があるのか?ということですが、一時的に物理演算を切りたい場面などがたまにあるのでそういう時のために用意されています。
衝突判定
デフォルトは「非連続的」となっています。しかし高速移動する物体の場合は衝突判定がこのままだとすり抜けてしまうことがあるので、そのような場合は「連続的」に変更すると良いでしょう(※ただし、その分少し負荷がかかります)。
2D用リジッドボディの設定項目
3D用の方とだいたい同じなので、違う部分だけ表にまとめておきますね(※ボディタイプによって設定できる項目が変化します。以下は「動的」の場合の項目です)。
項目 | 機能 |
ボディタイプ | オブジェクトがどのような挙動をするかを選択 |
マテリアル | 物理マテリアルを指定 |
重力スケール | 重力を何倍にするか |
スリープモード | 物理演算を休止させるモードを選択 |
ボディタイプ
2D用のリジッドボディの場合、ボディタイプという項目がありここでオブジェクトがどのような挙動をするかを選択することができます。ボディタイプは次の3種類があります。
- 動的
- キネマティック
- 静的
それぞれの特徴をざっくり紹介すると、
- 動的:物理演算の影響を受ける
- キネマティック:物理演算の影響を受けるが、動きをスクリプトで制御するのが前提
- 静的:物理演算の影響を受けない
という感じになっているようです。この辺の詳しい説明は公式マニュアルの「Rigidbody 2D」を参照してください。
リジッドボディを使う時の注意点
さて、Unityでリジッドボディを使うときは一つ注意があります。それは「リジッドボディを使った処理はFixedUpdate内で行うようにする」ということです。具体的なスクリプトは例えば次のようになります。
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void FixedUpdate() { rb.AddForce(10.0f * Vector3.up); } }
ところでスクリプトを作ると最初からUpdateメソッドがありますが、FixedUpdateメソッドはそちらとは一体どう違うのでしょうか?
UpdateとFixedUpdateの違い
この2つのメソッドの違いは実行されるタイミングです。
Updateは処理状況に応じてバラバラなタイミングで呼び出されるのに対し、FixedUpdateは決まった間隔(例えば0.02秒毎とか)で呼び出されます。
なぜFixedUpdate内でRigidbodyの処理をするのか?
ではなぜFixedUpdate内でリジッドボディの処理をするのかというと、FixedUpdateは物理演算の実行前に呼び出されるメソッドだからです。物理演算は決まった間隔で処理されるのが前提なので、FixedUpdate内に処理を書く必要があるのです。
以上、少し長くなりましたがリジッドボディの使い方について説明しました。リジッドボディはアクションゲーム等では必ずといっていいほどよく使うコンポーネントなので、しっかりと理解するようにしてください。