0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity実践】Rigidbody を体感しよう! #2

0
Last updated at Posted at 2026-04-29

はじめに

こんにちは、オカダです!

ゲームを作っていると、ただオブジェクトを置くだけではなく、

  • 落ちる
  • 跳ねる
  • 押される
  • 転がる
  • ぶつかった勢いで動く
  • ジャンプする
  • 爆発で吹っ飛ぶ

といった「物理っぽい動き」を作りたくなる場面が必ず出てきます。

このような動きを作るときに重要になるのが Rigidbody です。

前回の Collider / Trigger 回では、「どこに当たり判定があるのか」「通り抜けられるセンサーをどう作るのか」を学びました。

今回扱う Rigidbody は、その次の一歩です。

Collider が 当たり判定の形 だとすると、Rigidbody は その物体が物理の世界でどう動くか を担当します。

また、これは私が所属している徳島大学ゲームクリエイトプロジェクトの勉強会で使用するものです。興味がありましたら、UnityroomX公式アカウントなども見てみてください!

この記事の目標

この記事を読み終えるころには、次のことができるようになることを目指します。

  • Rigidbody が何をするコンポーネントなのか説明できる
  • Collider と Rigidbody の役割の違いが分かる
  • Mass / Linear Damping / Angular Damping / Use Gravity / Is Kinematic / Constraints の意味が分かる
  • Rigidbody を動かすときに FixedUpdate を使う理由が分かる
  • AddForce と ForceMode の違いを説明できる
  • Rigidbody を使うべき場面と、使わない方がいい場面を判断できる
  • 高速物体のすり抜け、ガタつき、倒れるプレイヤーなどの基本的な対策が分かる

0. まずは例えでイメージしよう

Rigidbody は、ざっくり言うと、

オブジェクトを物理の世界に参加させるための部品(コンポーネント)

です。

Scene に Cube を置いただけの状態を考えてみましょう。

その Cube は、見た目としては存在しています。しかし、何もしなければ勝手に落ちたり、押されたり、転がったりはしません。

これは、まだ「物理の世界に参加していない」からです。

一方、Cube に Rigidbody を付けると、その Cube は Unity の物理エンジンにとって「質量を持った剛体」になります。

つまり、

  • 重力を受ける
  • 力を加えられる
  • 衝突の結果として動く
  • 回転する
  • 他の Rigidbody と物理的に反応する

ようになります。

例えるなら、Collider は「体の輪郭」、Rigidbody は「体重や慣性」です。

体の輪郭だけあっても、その物体が押されたときにどう動くかは決まりません。そこに Rigidbody が加わることで、「この物体はどれくらい動きにくいのか」「重力で落ちるのか」「力を受けて回転するのか」が決まります。

1. Rigidbody とは?

Rigidbody は、GameObject に物理ベースの移動や回転を与えるコンポーネントです。

Unity では、通常 GameObject の位置や回転は Transform が持っています。

しかし、物理挙動を伴うオブジェクトは、Transform を直接変更するのではなく、Rigidbody を介して操作するのが基本です。

なぜなら、Transform を直接変更すると、物理エンジンの計算を無視して位置が強制的に更新されるため、衝突判定の抜けや不自然なめり込み、慣性の消失、ガタつきなどの問題が発生します。つまり「物理として移動する」のではなく、「瞬間移動した」扱いになってしまいます。

一方で、 Rigidbody を使えば、速度・重力・衝突・摩擦などを物理エンジンが考慮したうえで移動を計算してくれるため、より自然で安定した挙動になります。

2. Rigidbody を触ってみよう

まずは細かな説明よりも、実際に見てみましょう。

2.1 Cube と Plane を置く

Hierarchy を右クリックして、次の2つを作成します。

  • 3D Object > Cube
  • 3D Object > Plane

Cube は少し上に移動しておきます。

例えば、

  • Cube の Position は,(x, y, z) = (0, 3, 0)
  • Plane の Position は,(x, y, z) = (0, 0, 0)

この時点で再生しても、Cube は空中に止まったままです。

planeとcubeのスクショ.png

2.2 Cube に Rigidbody を追加する

Cube を選択して、Inspector から

Add Component > Rigidbody

を追加します。

そのまま Play してみてください。

Cube が下に落ちて、Plane の上で止まるはずです。

cubeが落ちる様子.png

これは Rigidbody の Use Gravity が有効になっているからです。

ここで大事なのは、

Rigidbody を付けた瞬間、Cube が物理シミュレーションの対象になった

ということです。

3. Collider と Rigidbody の違い

前回扱った Collider は、当たり判定の形です。

一方、Rigidbody は、その当たり判定を持った物体が物理的にどう動くかを決めます。

物理的な挙動をさせたい場合、どちらのコンポーネントを付けるべきでしょうか?

比べてみましょう。

状態 Unity上での扱い 衝突する? 物理で動く?
Rigidbodyあり / Colliderなし 物理エンジン上では「動く物体」として扱われるが、衝突の形がない × しない ○ 動く 形のない物体。重力で落ちても床をすり抜ける
Rigidbodyなし / Colliderあり 物理エンジン上では「固定された当たり判定」として扱われる ○ する × 基本的に動かない 壁、床、固定された箱
Rigidbodyあり / Colliderあり 物理エンジン上で「動く物体」として扱われ、衝突もできる ○ する ○ 動く 落下する箱、転がるボール、吹き飛ぶ敵

つまり、普通の物理的な挙動をさせたいオブジェクトには、

  • Collider
  • Rigidbody

の両方が必要です。

4. Rigidbody の基本設定

ここからは、Inspector に表示される Rigidbody のよく使う設定を見ていきます。実際にエディタ上で触ってみながら学びましょう。

4.1 Mass

Mass は質量です。

単位は kg として扱われ、デフォルト値は 1 です。

Mass は、物体が力を受けたときの動きにくさに影響します。

同じ力を加えた場合、

  • Mass が小さい → 動きやすい
  • Mass が大きい → 動きにくい

となります。

例えば、同じ力でピンポン玉と鉄球を押したら、ピンポン玉の方が大きく動きます。Mass はこの違いを表すための設定です。

ただし、ここで初心者がよく誤解するポイントがあります。

Mass を大きくしても、重力による落下速度そのものが遅くなるわけではありません。

「重いものは速く落ちそう」「軽いものはゆっくり落ちそう」と感じるかもしれません。

しかし、Unity の標準的な物理では、同じ重力を受ける物体は基本的に同じ加速度で落ちます。

Mass が効いてくるのは、主に次のような場面です。

  • AddForce で押す(後で解説)
  • 衝突する
  • 他の物体と押し合う

つまり Mass は、落下速度というより、

外から力を受けたときの反応のしにくさ

だと理解するとよいです。

4.2 Linear Damping

Linear Damping は、直線方向の速度がどれくらい減衰するかを決める設定です。ざっくり言うと、空気抵抗や摩擦のような効果を表します。

  • 値が小さい → 速度が落ちにくい
  • 値が大きい → 速度がすぐ落ちる

という設定です。

例えば、氷の上で箱を押すと、スーッと長く滑ります。

一方、カーペットの上で箱を押すと、すぐ止まります。

Linear Damping は、この「動き続けやすさ」を調整する設定だと考えると分かりやすいです。

ただし、Linear Damping は厳密な地面との摩擦そのものではありません。

地面との接触時の摩擦は Physics Material なども関係します。(後で解説)

Linear Damping は、Rigidbody 全体の速度を減衰させる設定です。

試しに、 Cube を選択し、 Inspector から Linear Damping の値を 10 にしてみましょう。前回よりゆっくり Cube が落ちたら成功です。

4.3 Angular Damping

Angular Damping は、回転版の Damping です。

ざっくり言うと、

  • 値が小さい → くるくる回り続ける
  • 値が大きい → 回転が早く止まる

です。

ただし、Angular Damping を極端に大きくしても、それだけで完全に回転を止めるための設定ではありません。回転を本当に止めたい場合は、後で説明する Constraints を使うべきです。

試しに、 Plane を選択し、 Z軸の Rotation を 15 にしてから、 Cube の Angular Damping の値を変えてみましょう。値によって Cube の回転の様子が変われば成功です。

4.4 Use Gravity

Use Gravity は、重力の影響を受けるかどうかを決める設定です。

オンにすると、Rigidbody は重力でY軸下向きに引っ張られます。

オフにすると、Rigidbody が付いていても重力では落ちません。

例えば、次のようなものは Use Gravity をオフにすることがあります。

  • 空中に浮く敵
  • 重力を受けない弾
  • スクリプトで完全に制御したい物体
  • 水中や浮遊ギミックの一部

ここで覚えておきたいのは、

Rigidbody が付いている = 必ず落ちる

ではないということです。

落ちるかどうかは Use Gravity が決めます。

4.5 Is Kinematic

Is Kinematic は、Rigidbody を「物理で動かすか、自分で動かすか」を切り替える設定です。

Is Kinematic をオンにすると、その Rigidbody は重力や AddForce、衝突による押し出しでは動かなくなります。
つまり、物理エンジンに動かされるのではなく、スクリプトやアニメーションで位置を決める物体になります。

例えば、通常の箱やボールは Is Kinematic をオフにします。

重力で落ちたり、押されたり、ぶつかって動いたりしてほしいからです。

一方で、次のようなものは Is Kinematic をオンにすることがあります。

  • 動く床
  • 決まったルートを動く足場
  • アニメーションで開く扉

ここで大事なのは、動く床やエレベーターのように「動く Collider」は、Collider だけで済ませない方がよいという点です。

Collider だけの床を Transform で直接動かすと、物理エンジンから見ると「静的な床が急に移動した」ような扱いになり、乗っているプレイヤーがガタついたり、めり込んだり、うまく運ばれなかったりすることがあります。

そのため、動く床のように「自分で動かしたいが、他の Rigidbody とは正しく接触してほしい」物体には、 Is Kinematic をオンにします。

また、 Is Kinematic をオンにすると、物理で動く Rigidbody を押すことはできますが、逆に物理で動く Rigidbody から押されて動くことは基本的にありません。

つまり、Kinematic は、

物理世界には存在するが、自分自身の移動はスクリプトやアニメーションで決める物体

だと考えると分かりやすいです。

判断基準はシンプルです。

  • 動かない床・壁・地形 → Collider だけでよい
  • 物理で動く箱・ボール → Rigidbody、Is Kinematic オフ
  • スクリプトで動かしたい床・扉・ギミック → Rigidbody、Is Kinematic オン

4.6 Interpolate

Interpolate は、Rigidbody の見た目のガタつきを減らすための設定です。

Rigidbody の物理計算は FixedUpdate のタイミングで行われます。

(FixedUpdate 一定時間間隔の更新処理です。5 で詳しく解説します。)

一方、画面の描画はフレームごとに行われます。

この2つの更新タイミングがズレることで、カメラで追いかけている Rigidbody が少しガタガタして見えることがあります。

そこで Interpolate を使います。

Interpolate には主に次の選択肢があります。

設定 意味
None 補間なし
Interpolate 過去の物理更新を使ってなめらかに見せる
Extrapolate 次の位置を予測してなめらかに見せる

まずは None のまま作り、プレイヤーやカメラ追従対象がガタついて見える場合に Interpolate を試す、くらいで十分です。

4.7 Collision Detection

Collision Detection は、衝突判定の精度と処理負荷に関わる設定です。

普通の速度で動く物体なら、基本的にはデフォルトの Discrete で十分です。

しかし、弾丸や超高速移動するプレイヤーのような、1フレームで大きく移動する物体では、壁をすり抜けることがあります。

これは「前の物理更新では壁の手前、次の物理更新では壁の向こう側」に移動してしまい、途中の壁との接触を見逃すためです。

そこでこの Collision Detection を使います。

Collision Detection には、主に次のモードがあります。

モード 特徴 使いどころ
Discrete 軽い。基本はこれ 普通の速度の物体
Continuous 静的 Collider との高速衝突に強い 高速で壁や地形に当たる物体
Continuous Dynamic 高速な動的 Rigidbody 同士も考慮 重要な高速物体に限定
Continuous Speculative 比較的バランスがよい高速物体対策 Discrete で抜ける場合の最初の候補

デフォルトの最も軽い Discrete から試し、すり抜けが起きた場合に Continuous Speculative などへ切り替えるのがおすすめです。
また、 Continuous や Continuous Dynamic は CPU 使用量が大きくなりやすいため、必要なものにだけ使うべきです。

4.8 Constraints

Constraints は、Rigidbody の移動や回転を特定の軸だけ固定する設定です。

よく使うのは、プレイヤーが倒れないようにする設定です。

例えば、Capsule のプレイヤーに Rigidbody を付けると、壁や物にぶつかったときに前後左右へ倒れることがあります。

それを防ぐには、

  • Freeze Rotation X
  • Freeze Rotation Z

をオンにします。

これで、プレイヤーが前後左右に倒れなくなります。

Constraints は、

この軸だけは勝手に動くな・回るな

と指定するための指示だと考えると分かりやすいです。

5. FixedUpdate を理解しよう

Rigidbody を使うなら、FixedUpdate の理解が重要です。

Unity には、よく使う Update() のほかに、物理更新向けの FixedUpdate() があります。

メソッド 呼ばれるタイミング 主な用途
Update フレームごと 入力、見た目、通常の更新
FixedUpdate 固定間隔の物理更新ごと Rigidbody、AddForce、物理処理

なぜ Update ではなく FixedUpdate なのか。

理由は、画面のフレームレートと物理シミュレーションの更新タイミングが別だからです。

Update は FPS によって呼ばれる回数が変わります。

例えば、60fps なら1秒に約60回、120fps なら1秒に約120回呼ばれます。これでは、 FPS が違う場合、物理挙動が変わってしまいます。

一方、FixedUpdate は物理用の固定間隔で呼ばれます。

そのため、Rigidbody への力の追加や速度変更は FixedUpdate に書いた方が、物理シミュレーションとタイミングが合いやすくなります。

6. AddForceを使ってみよう

まずは以下のスクリプトを作成し、 Cube にアタッチして動かしてみましょう。

using UnityEngine;

public class ExperimentAddForce : MonoBehaviour
{
    private Rigidbody rb;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        rb.AddForce(Vector3.up * 500);
    }
}

Cube がY軸上向きに上昇すれば成功です。

次に、Start 関数の中身を以下に変えてみましょう。

transform.position += new Vector3(0f, 50f, 0f);

Play した瞬間、 Cube が消えて、数秒後に落ちてきたら成功です。(Plane をすり抜けた場合は Cube を選択し、 Rigidbody の Collision Detection を変更してください)

これは「座標を直接ずらす」書き方です。

UI や背景、演出用のオブジェクトならこれで問題ない場面も多いですが、物体を物理的に動かしたい場合は、基本的には Rigidbody を通して動かしましょう。

7. ForceMode を理解しよう

AddForce には ForceMode があります。

これは、加える力をどう解釈するかを決める設定で、力を与えられた GameObject の速度変化の計算方法が変わります。

ForceMode 質量の影響 時間の影響 イメージ 使いどころ
Force 受ける 受ける 押し続ける 車、風、継続的な力
Impulse 受ける 受けない 一瞬ドン ジャンプ、爆発、キック
Acceleration 受けない 受ける 同じ加速度 操作感重視の移動
VelocityChange 受けない 受けない 速度を即変更 ダッシュ、即時補正

初心者はまず、

  • 押し続ける → Force
  • ジャンプ → Impulse
  • 重さを無視したい → Acceleration / VelocityChange

くらいで覚えると十分です。

詳細に知りたい場合は、以下を参考にしてください。

1. ForceMode.Force `ForceMode.Force` は、継続的に押す力です。

車のアクセルを踏み続けるようなイメージです。

特徴は次の通りです。

  • 継続的に効く
  • FixedUpdate で押し続ける使い方が多い
  • Mass の影響を受ける
  • 重い物体ほど同じ力では動きにくい

向いている例は次の通りです。

  • 車の加速
  • 風に押される物体
  • 宇宙船の推進
  • 少しずつ押される箱
2. ForceMode.Impulse `ForceMode.Impulse` は、一瞬だけドンッと加える力です。

ジャンプや爆発、キックのような瞬間的な動きに向いています。

特徴は次の通りです。

  • 一瞬で効く
  • Mass の影響を受ける
  • FixedUpdate で1回だけ呼ぶ使い方が多い
  • ジャンプ、ノックバック、爆発などに向く

例えば、ジャンプでは次のように使います。

rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);

ジャンプは、上方向に押し続けるというより、一瞬だけ上向きの勢いを与える動きです。
そのため Force より Impulse の方がイメージに合います。

3. ForceMode.Acceleration `ForceMode.Acceleration` は、加速度として力を加えるモードです。

特徴は、

Mass の影響を受けない

ことです。

つまり、Mass が 1 の物体でも 10 の物体でも、同じように加速します。

向いている例は次の通りです。

  • 重さに関係なく同じ操作感にしたいキャラクター
  • 宇宙船やドローンの移動
  • 物理っぽさよりゲーム操作感を優先したい場合
4. ForceMode.VelocityChange `ForceMode.VelocityChange` は、速度を直接変えるようなモードです。

これも Mass の影響を受けません。

かなり直接的に速度を変えるため、物理っぽさは少し薄れます。

8. Rigidbody を使わない方がいい場面

Rigidbody は便利ですが、何でもかんでも付ければいいわけではありません。

むしろ、必要ないものに大量に付けると、ゲームが重くなったり、予想外の物理挙動が増えたりします。

8.1 ただの背景

遠くの建物、背景の山、装飾用の壁など、動かないものに Rigidbody は基本的に不要です。

Collider が必要なら Collider だけで十分です。

8.2 UI

ボタン、HP バー、スコア表示などに Rigidbody は普通使いません。

8.3 演出

「このオブジェクトを、決まった時間に、決まった位置へ、正確に動かしたい」

という演出では、Rigidbody より Transform や Tween の方が扱いやすいことがあります。

Rigidbody は物理の影響を受けるため、完全に決まった動きをさせたい場合は逆に邪魔になることがあります。

9. この記事で使った考え方のまとめ

最後に、Rigidbody の重要ポイントを整理します。

  • Rigidbody は、GameObject を物理の世界に参加させるコンポーネント
  • Collider は「ぶつかる形」、Rigidbody は「どう動くか」
  • Rigidbody だけでは衝突形状にならないため、普通は Collider も必要
  • Mass は力を受けたときの動きにくさに関係する
  • Mass を大きくしても、重力下の落下速度そのものが遅くなるわけではない
  • Linear Damping は直線速度の減衰
  • Angular Damping は回転速度の減衰
  • Use Gravity をオフにすると、Rigidbody があっても重力では落ちない
  • Is Kinematic をオンにすると、物理の力では動かず、自分で動かす Rigidbody になる
  • Interpolate は、Rigidbody の見た目のガタつきを減らすための設定
  • Collision Detection は、高速物体のすり抜け対策に関係する
  • Constraints は、特定の軸の移動や回転を止める設定
  • Rigidbody を動かす処理は FixedUpdate を意識する
  • AddForce は Rigidbody に力を加える基本メソッド
  • ForceMode によって、力のかかり方が変わる
  • 何でも Rigidbody にするのではなく、物理っぽい反応が必要なものに使う

次回は少し話が変わり、入門生ゲーム制作 に向けて、複数人での開発に必須の Git というツールを学びます。

さらにその次の回では、これまで学んだ Collider / Trigger / Rigidbody を整理し、

  • スコア加算
  • 落下で失敗
  • アイテムの回収
    など、ゲームのルールを実際に作ってみる回になります。お楽しみに!
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?