【Unity】Rigidbodyとは?オブジェクトに重力や力を与えられる

重力を付けるRigidbodyとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのRigidbodyってなに?」

「Rigidbodyってどんなときに使えばいいの?」

というお悩みの方に向けた内容となっています。

Unityが提供しているコンポーネントの一つに、Rigidbody(リジッドボディ)コンポーネントというものがあります。

このRigidbodyという機能は、オブジェクトに対して重さや力を加えて、物理的な動きを行うことができる機能となっています。

例えば、オブジェクトに重力を付けたり、力を加えたら自然と抵抗が働いて少しずつ減速するようにしたり、など物理的な動きの処理を自動的に行ってくれます。

そこで、このページでは、Unityが提供しているRigidbodyコンポーネントについて、どんな機能なのか、また使い方や注意点などをまとめていきます。

なお、このページでは、

Windows11
Unity Hub3.11.0
Unity6

のバージョンで解説しています。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Rigidbody(リジッドボディ)とは?

Rigidbody(リジッドボディ)は、Unityのコンポーネント機能の一つとなっています。

オブジェクトに物理的な挙動を持たせる機能

Rigidbodyとは、オブジェクトに対して物理的な動きを持たせるためのコンポーネントとなっています。

物理的な動きというのは、

などのような、物理的な力の動きのことです。

例えば、Unityでは、オブジェクトを配置してそのままゲーム実行しても、オブジェクトに重さは無いので落ちたりすることがありません。

しかし、Rigidbodyコンポーネントを付けると、オブジェクトに重さが反映されるため、重力によって自動的に落ちることになります。

このような物理的な動きを付けるのに、Rigidbodyコンポーネントは非常に便利に使うことができる機能です。

衝突判定を持たせるのにも使う

Rigidbodyコンポーネントは、オブジェクトに対して当たり判定を持たせるためにも使われている機能です。

具体的には、Rigidbodyコンポーネントでオブジェクトに物理的な動きを行えるようにして、Collider(コライダー)コンポーネントでその当たり判定の範囲を設定することで、オブジェクト同士の衝突や当たり判定を検知することができます。

そのため、Unityでゲームを作る際は、このRigidbodyコンポーネントColliderコンポーネントは非常によく使われている機能となってきます。

なお、当たり判定やColliderコンポーネントについては、以下の記事で細かく解説していますので、参考にしてみてください。

Rigidbody(リジッドボディ)の使い方

ここからは、Rigidbodyコンポーネントの使い方について紹介していきます。

コンポーネントからアタッチしていく

Rigidbodyを使う際は、そのオブジェクトを選択して、インスペクターウィンドウから「Add Component」をクリックします。

次に、2Dゲームの場合は「Physics 2D」、3Dゲームの場合は「Physics」を選択します。

そして、2Dゲームの場合は「Rigidbody 2D」、3Dゲームの場合は「Rigidbody」を選択することで、Rigidbodyコンポーネントを使うことができます。

Rigidbodyの設定項目

Rigidbodyコンポーネントには、以下のように2D/3Dどちらにも様々な設定項目があります。

Rigidbody 2D
Rigidbody

それぞれの設定項目がどのようなものなのか、簡単に紹介していきます。

Mass:オブジェクトの質量(2D/3D)

Massは、そのオブジェクトの質量を設定する値で、単位をkgとして設定できます。

このMassの値が小さければ、オブジェクトが軽くなるため動きやすくなります。

反対に大きければ、オブジェクトが重くなるので動きにくくなることになります。

以下は、赤色のMassを「1」、黄色のMassを「2」にして、その他は同条件で力を加えた場合です。

Linear Damping:移動に対しての空気抵抗(2D/3D)

Linear Dampingは、オブジェクトを減速させるための値で、オブジェクトの移動に対しての空気抵抗を表している数値です。

このLinear Dampingの値が大きいと、そのオブジェクトの移動はすぐに減速することになります。

反対に値が小さいと、そのオブジェクトの移動がより長く動くことになります。

以下は、赤色のLinear Dampingを「0」、黄色のLinear Dampingを「0.5」にして、その他は同条件で力を加えた場合です。

Angular Damping:回転に対しての空気抵抗(2D/3D)

Angular Dampingは、Linear Dampingと同じくオブジェクトの空気抵抗を表していて、どれだけ回転に抵抗するかを制御している値です。

このAngular Dampingの値が大きいと、そのオブジェクトの回転はすぐに減速することになります。

反対に値が小さいと、そのオブジェクトの回転がより長く回り続けることになります。

以下は、赤色のAngular Dampingを「0.05」、黄色のAngular Dampingを「1」にして、その他は同条件で力を加えた場合です。

Automatic Center Of Mass:重心の位置を予測する(3Dのみ)

Automatic Center Of Massは、オブジェクトの重心の位置をRigidbodyの形とスケールを元に、自動で予測して決める設定となっています。

デフォルトでは、このAutomatic Center Of Massにチェックが入っています。

もし、独自で重心の位置を設定したいときは、チェックを外すことでCenter Of Massを設定することができます。

Automatic Tensor:慣性テンソルを自動で予測(3Dのみ)

Automatic Tensorは、オブジェクトの慣性テンソルおよび慣性テンソルの回転を、Colliderを元に物理演算で自動で設定してくれる機能です。

簡単にいえば、オブジェクトを回転させるのに、必要な力を自動で計算して設定してくれています。

デフォルトでは、Automatic Tensorにチェックが入っていますが、このチェックを外すと、独自で慣性テンソルを定義することができます。

Use Gravity:重力の影響を与える(3Dのみ)

Use Gravityは、オブジェクトに対して重力の影響を与えるかどうかを決めている項目です。

これが設定されているオブジェクトは、Y軸に対して下方向に重力が加わるため、床が無いと自然落下が発生します。

デフォルトでは、Use Gravityにチェックが入っていますが、重力の影響を受けない無重力空間などを作りたい場合は、チェックを外しましょう。

以下は、黄色だけUse Gravityを外して、その他は同条件で力を加えた場合です。

Is Kinematic:オブジェクトに力を加えられなくする(3Dのみ)

Is Kinematicは、オブジェクトに対して、力を加えることが出来るかどうかを決めている項目です。

Rigidbodyを付けたオブジェクトを移動させる場合、基本的にAddForceメソッドでオブジェクトに力を加えて動かすことになりますが、Is Kinematicにチェックを入れた場合は、力を加えても動かなくなります。

そのため、オブジェクトをTransformを使って移動させたいという時に、Is Kinematicのチェックを入れておきましょう。

なお、Is KinematicはUse Gravityのオン・オフにかかわらず、重力も付かなくなります。

Interpolate:物理的処理を滑らかにする(2D/3D)

Interpolateは、オブジェクトの物理処理をより滑らかにするための項目です。

補間とも呼ばれますが、物理演算の更新と更新の間に、オブジェクトの位置を計算してあげることで、画面のかくつきを減らすという処理を行います。

デフォルトでは、Noneで処理は入っていませんが、これをInterpolate、もしくはExtrapolateにすることで、処理が加わるようになります。

Collision Detection:当たり判定を定義する(2D/3D)

Collision Detectionは、他のオブジェクトとの当たり判定を定義するための設定項目です。

例えば、高速で動くオブジェクトの場合は、衝突させたいのにフレームの隙間ですり抜けてしまい衝突できないということが起きます。

Collision Detectionは、これらの動きを防ぐためのもので、デフォルトではDiscreteになっていますが、Continuous・Continuous Dynamic・Continuous Speculativeを選択すると、当たり判定の定義が変わります。(2DはNoneとContinuousのみ)

Body Type:物理的な挙動を決める(2Dのみ)

Body Typeは、Rigidbody 2Dの挙動を決める設定項目となっていて、「Dynamic」「Kinematic」「Static」の3つのうちから選びます。

物理的な処理を入れたいオブジェクトには、デフォルトのDynamicで問題ありません。

重力や力の影響を受けたくないけど、オブジェクトをTransformで移動させたい場合はKinematic、移動もさせずにほぼ固定させる場合はStaticを選択します。

Material:摩擦や反発を調整できる(2Dのみ)

Materialは、Physics Materialを使って物理的な材質によるオブジェクトの摩擦や反発力を調整することができる項目です。

Rigidbody 2DにMaterialを設定することで、アタッチされているColliderの全てに共通のPhysics Materialを設定することができます。

Physics Materialについては、後ほど解説しています。

Simulated:物理的処理を行うかどうか(2Dのみ)

Simulatedは、物理的処理を行うかどうかを決めている項目です。

デフォルトでは、このSimulatedがオンになっていますが、チェックをしないと物理的な動きがなくなり、Rigidbodyを付けていないのと同じ状況になります。

また、チェックが外れていると、Colliderによる当たり判定も行わなくなります。

Use Auto Mass:質量を自動で決める(2Dのみ)

Use Auto Massは、そのオブジェクトにアタッチされているColliderを元に、自動的に質量を検出することができる項目です。

Use Auto Massにチェックを入れると、Massの項目がグレーアウトされて自動で質量が決まります。

Gravity Scale:重力の度合いを決められる(2Dのみ)

Gravity Scaleは、そのオブジェクトの重力の度合いを決めることができる項目です。

値が大きければ大きいほど、重力が強くなり、より下への力が強くなります。

また、値を0以下にすると、逆に重力がかかるので、オブジェクトが浮かんでいくことになります。

以下は、赤色のGravity Scaleを「1」、黄色のGravity Scaleを「-1」にして、その他は同条件にした場合です。

Sleeping Mode:スリープモードからの解除方法(2Dのみ)

Sleeping Modeは、オブジェクトがスリープした際の解除タイミングを選択することができます。

Rigidbodyの物理演算の処理は、常に行われているのではなく、一旦スリープモードにして、そこから解除させて物理演算の処理を行うことで、ゲーム内での負荷を減少させています。

Sleeping Modeの項目では、このスリープモードから解除させるタイミングを「Never Sleep」「Start Awake」「Start Asleep」の3つから選択します。

Use Full Kinematic Contacts(2Dのみ)

Use Full Kinematic Contactsは、Body Typeを「Kinematic」にした時だけ表示される項目です。

通常、Kinematicにすると、衝突判定はDynamicにしているオブジェクトとのみ行うことができますが、このUse Full Kinematic Contactsにチェックを入れると、Dynamic・Kinematic・Staticの全てのBody Typeのオブジェクトと衝突判定を行うことができます。

摩擦や反発はColliderのPhysics Materialで調整できる

オブジェクトの摩擦や反発の調整を行う場合は、オブジェクトに付けたColliderコンポーネントの設定項目にあるPhysics Materialというもので設定していきます。

このPhysics Materialは、物体の物理的な材質を決めているもので、オブジェクトが動いている際の摩擦や、オブジェクト同士が当たった際の反発を設定できるものになっています。

Physics Materialを作成する際は、プロジェクトウィンドウの+ボタンから3Dゲームなら「Physics Material」、2Dゲームなら2Dの中の「Physics Material 2D」から作成することができます。

Rigidbody(リジッドボディ)を使う際の注意点

ここからは、Rigidbodyコンポーネントを使った際の注意点をまとめていきます。

移動させるときにTransformを使わない

Rigidbodyを使う際、Transformを使ってオブジェクトの移動を行わないようにしましょう。

Rigidbodyには物理演算の処理を行う機能がありますが、Transformで直接座標を変更したりすると、物理演算に反映されなくなってしまうため、挙動がおかしくなってしまいます。

そこで、Rigidbodyを使ったオブジェクトを移動させたい場合は、Transformを使わずにRigidbodyが持っているAddForceメソッドで、オブジェクトに力を加える処理を行っていきましょう。

落下するのでColliderを付けた床を設置する

最初にも解説していますが、Rigidbodyを使うと、オブジェクトに重力が働くので、ゲーム画面に配置してもそのまま落ちてしまいます。

そこで、オブジェクトが落下し続けないように、を置くようにしましょう。

床には、Colliderコンポーネントを付けておくことで、オブジェクトが重力を持っていても、その床の上で止まることになります。

また、床のColliderコンポーネントは、すり抜けないように「Is Trigger」のチェックを外しておきましょう。

なお、床や地面は物理演算の必要がないので、基本的にRigidbodyは付けずにColliderコンポーネントだけ付けておけば良いかと思います。

まとめ

このページでは、オブジェクトに重力などの物理演算を付けることができるRigidbodyコンポーネントについて、仕組みや使い方を紹介していきましたが、いかがでしたでしょうか?

Rigidbodyは、重力空気抵抗摩擦反発などの物理演算をすべて自動で行ってくれる機能で、Unityでゲームを作る際は非常によく使う機能です。

Rigidbodyの設定項目はたくさんあり非常に複雑ですが、それだけ出来ることも増えていきますので、少しずつ覚えていきましょう。

また、Rigidbodyを付けたオブジェクトを動かす際、Transformを使わないように注意しておきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント