🤖

ゲーム開発で必須なUnity×C#×コンポーネント : 【Rigidbody】で表現する物理挙動

2025/01/14に公開

ゲーム開発で必須なUnity×C#×コンポーネント : Rigidbody

Unityでオブジェクトを物理的に動かすには、Rigidbodyというコンポーネントが欠かせません。キャラクターやアイテムを重力下で落下させたり、力を加えて吹き飛ばしたり――物理シミュレーションを簡単に取り入れることができるのがRigidbodyの魅力です。しかし、いざ使ってみると「何か動きが変?」「どのパラメータをいじればいいの?」と戸惑いがち。そこで本記事では、Rigidbodyの基本C#スクリプトとの連携をわかりやすく紹介します。

なぜRigidbodyが必須なのか

1. 物理挙動を自動でシミュレーション

Rigidbodyは、重力や衝突といった物理現象を自動で再現してくれます。自分で「フレームごとにY座標を落とす」などをコードに書かなくても、Rigidbodyを付けるだけで自然な落下や転倒を表現可能。
ゲーム開発では**「いかにリアルさや説得力のある挙動を作るか」**が大切なので、Rigidbodyはその役割を大きく担ってくれる存在です。

2. 力を加えて動きを演出

Rigidbodyは単に重力をかけるだけでなく、AddForceメソッドを使えば「外力を加えてオブジェクトを飛ばす」といったシーンも簡単に作れます。たとえば「爆発で周りのオブジェクトを吹き飛ばす」「弾丸が当たって敵がのけぞる」など、多彩な動きが可能になります。

3. 物理演算でプレイヤー操作も楽になる

ジャンプや移動を物理ベースでやりたいなら、Rigidbodyを活用すると計算がシンプルです。キャラクターコントローラーを自作しなくても、Rigidbodyの力とColliderを使い**“勝手に”**地形に合わせて衝突判定が働き、プレイヤーキャラを自然に動かせます。

Rigidbodyの基本設定

1. コンポーネントをアタッチ

まずGameObjectにRigidbodyを付けましょう。3DならRigidbody、2DならRigidbody2Dです。

  • Use Gravity: 重力を受けるかどうか
  • Mass: 質量。軽いほど動きやすく、衝突時に吹き飛びやすい
  • Drag, Angular Drag: 空気抵抗や回転時の抵抗

2. Constraintsで動きや回転を固定

「軸回転させたくない」「特定の方向には動かさない」などの制限をしたい場合はConstraintsで固定できます。

  • Freeze Position X/Y/Z: その方向の移動をロック
  • Freeze Rotation X/Y/Z: その軸回転をロック
    キャラクターが倒れないようにZ回転だけ固定しておけば、横倒しにならずに済むわけです。

3. Collision Detectionで衝突精度

衝突検知はDiscreteContinuousが選べます。

  • Discrete: 軽量だが高速移動のすり抜けが起こる可能性
  • Continuous: CPU負荷が高いが、すり抜けしにくい
    高速移動をする弾丸や車などにはContinuousを検討しましょう。

C#スクリプト×Rigidbodyの連携

1. Rigidbody取得と移動の例

public class Mover : MonoBehaviour
{
    private Rigidbody rb;
    public float speed = 5f;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        float inputH = Input.GetAxis("Horizontal");
        float inputV = Input.GetAxis("Vertical");

        // 移動方向
        Vector3 moveDir = new Vector3(inputH, 0, inputV);
        moveDir = moveDir.normalized * speed;

        // 物理ベースの移動はFixedUpdate()でAddForceを使う場合が多い
        // ただしUpdate()中にVelocityを直接変更してもOK(物理挙動が制限される可能性あり)
        rb.velocity = new Vector3(moveDir.x, rb.velocity.y, moveDir.z);
    }
}
  • rb = GetComponent<Rigidbody>();でRigidbodyを取得
  • Velocityを直接操作→移動させる
  • 厳密にはFixedUpdate()でAddForceを使うのがおすすめだが、初心者向けにはVelocity操作でも感覚は掴みやすい

2. AddForceで衝撃を与える

public class Bomb : MonoBehaviour
{
    public float explosionForce = 500f;
    public float radius = 5f;

    void Explode()
    {
        Collider[] colliders = Physics.OverlapSphere(transform.position, radius);
        foreach (Collider c in colliders)
        {
            Rigidbody rb = c.GetComponent<Rigidbody>();
            if (rb != null)
            {
                rb.AddExplosionForce(explosionForce, transform.position, radius);
            }
        }
    }
}
  • AddExplosionForceを使えば、爆発の中心から円形(球形)範囲に力を加えられる
  • 大量の物体が吹き飛ぶ、派手な演出が一瞬で可能

3. FixedUpdateで物理演算を扱う

void FixedUpdate()
{
    if (isJumping)
    {
        rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
        isJumping = false;
    }
}
  • FixedUpdate()物理演算のタイミングで呼ばれるため、ここでAddForceや速度操作を行うのが原則。
  • Update()はフレームごとに呼ばれるが、物理シミュレーションは**FixedUpdate()**に合わせて行われるため、同期が取れなくなる可能性がある。

Rigidbodyの応用テクニック

1. Kinematicで自前制御

RigidbodyのIs Kinematicをオンにすると、物理演算を受けなくなります。ただし、Colliderとの衝突判定は残る。

  • NPCなどに対して細かいアニメーションや移動を自分で制御したい場合、Kinematicにして力や重力を無視することも多い
  • 物理的な衝突はしないけど、他オブジェクトを動かすトリガーとして利用できる

2. Interpolationで見た目を補完

高速回転するオブジェクトやネットワーク同期の際、**補間(Interpolate)**をオンにすると見た目が滑らかになります。

  • None … 補間なし
  • Interpolate … 前フレームとの中間を取る
  • Extrapolate … 次のフレームを予測して描画(場合によって不自然になる可能性)

3. Constraintsを動的に切り替える

スクリプトからFreezeRotationFreezePositionOn/Offすることで、特定のタイミングだけ回転をロックするなどの演出が可能。

  • 例:「ダメージを受けるまではZ回転フリー。ダメージ後にZ回転をFreezeして倒れないようにする」など

よくあるつまずきと解決策

1. すり抜けが起きる

  • 高速移動物体の場合はCollision DetectionContinuous
  • Mesh Colliderを使う場合、Convex設定で形状簡略化を検討

2. 意図せずオブジェクトが回転してしまう

  • Constraintsで回転をロックする
  • 2DならRigidbody2DFreeze Rotation Zなど

3. パフォーマンス問題

  • 大量のRigidbodyが同時に物理計算→一部をKinematicにするか、Layerを活用して衝突を減らす
  • 不要になったオブジェクトは早めに破棄して物理負荷を下げる

コンポーネント指向でRigidbodyを使うメリット

  • 付け外しが簡単: 必要になったらGameObjectにRigidbodyをアタッチすれば重力や衝突がすぐ使える
  • C#スクリプトとの分離: 力を加える処理などはスクリプト側で管理し、Rigidbody自体の設定はコンポーネントInspectorから操作
  • 再利用がしやすい: 似たような物理動作をしたい別のオブジェクトにも同じRigidbody設定をコピーしやすい

Rigidbodyのおかげで、わざわざ自前で物理公式を組まなくても自然な動きが得られるのは、開発効率を大きく高めてくれます。

まとめ:Rigidbodyを味方につけて、ゲームを自然に動かそう

  • RigidbodyはUnityの物理エンジンと連携し、重力や衝突を自動制御
  • AddForceAddExplosionForceで迫力ある動きを演出
  • C#スクリプトと組み合わせると自由な動きが実現
  • ConstraintsやInterpolationなどで挙動を細かく調整可能

**「空中に浮かせたい」「衝突で吹き飛ばしたい」「滑らかに移動したい」**など、物理演算が絡む場面ではRigidbodyを上手に使うのが得策。コンポーネントとして柔軟に付け替えできるので、多彩なシーンに応用できるのが最大のメリットです。ぜひプロジェクトで活用してみてください。

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

たった5日でFPSゲームが作れる自分に変わる教材はこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Rigidbodyの活用で、あなたのゲームに豊かな物理表現をプラスしてみてください。きっと操作感や演出のクオリティが一段上がり、プレイヤーをより深くゲーム世界へ引き込めるはずです。

Discussion