🏋️ Unity:Rigidbody(剛体)とは?

Unity

UnityにおけるRigidbodyコンポーネントは、ゲームオブジェクトに物理演算(Physics)のルールを適用するためのものです。Rigidbodyをアタッチすると、そのオブジェクトは重力の影響を受けたり、他のオブジェクトと衝突したときにリアルに跳ね返ったりするようになります。

1. 🛠️ Rigidbodyの追加

キー入力による移動を物理ベースに切り替えるには、まずオブジェクトにRigidbodyが必要です。

  1. 移動させたいゲームオブジェクト(例:Cube)を選択します。
  2. Inspectorビューの一番下にある「Add Component」をクリックします。
  3. 検索窓に「Rigidbody」と入力し、「Rigidbody」を選択して追加します。

これで、オブジェクトはゲーム開始と同時に下に落ちるようになります。


2. 📝 Rigidbodyを使った移動コード

前のセクションで使ったtransform.Translateは物理演算を無視して位置を強制的に変更するため、Rigidbodyを使う場合は、代わりに**Rigidbody.velocityまたはRigidbody.AddForce**を使います。

🚀 FixedUpdate()を使う理由

物理演算はフレームレート(Update()の実行頻度)とは独立して、一定の時間間隔で計算される必要があります。そのため、Rigidbodyを扱う処理は**Update()ではなくFixedUpdate()**関数内で記述するのが基本ルールです。

💡 コード例:物理ベースの前後左右移動

PlayerMovement.cs(または新しいスクリプト)を開き、以下のように変更します。

C#

using UnityEngine;

public class PhysicsMovement : MonoBehaviour
{
    public float speed = 500f; // 速度(Rigidbodyでは力を加えるため、値を大きくする)
    private Rigidbody rb;      // Rigidbodyコンポーネントへの参照

    // Start()でRigidbodyコンポーネントを取得する
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // 物理演算の更新タイミングで実行
    void FixedUpdate()
    {
        // 1. 入力を取得する
        float moveHorizontal = Input.GetAxis("Horizontal"); // A/Dまたは左右矢印
        float moveVertical = Input.GetAxis("Vertical");   // W/Sまたは上下矢印

        // 2. 移動の方向ベクトルと力を計算する
        // Yは0にして、地面と水平方向の力だけを加える
        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        // 3. Rigidbodyに力を加える
        // speedを乗算して、力を強くする
        rb.AddForce(movement * speed * Time.fixedDeltaTime);
    }
}

コードの解説

  • private Rigidbody rb;: スクリプト内でRigidbodyコンポーネントを操作するために、変数を宣言します。
  • rb = GetComponent<Rigidbody>();: Start()で、このスクリプトがアタッチされているゲームオブジェクトからRigidbodyコンポーネントを取得し、rb変数に格納します。
  • rb.AddForce(...): Rigidbodyに**力(Force)**を加えるメソッドです。力を加えることで、オブジェクトは慣性を持って加速・減速します。
    • Time.fixedDeltaTime: FixedUpdateが実行される一定の時間間隔。これを使うことで、フレームレートに依存しない安定した力を加えることができます。

3. ⬆️ ジャンプの実現(一瞬の力を加える)

Rigidbodyを使えば、一瞬で上向きの大きな力を加えることで簡単にジャンプを実装できます。

コード例にジャンプ機能を追加します。ジャンプの判定は頻繁な物理演算とは関係ないので、Update()関数内でキー入力の判定を行います。

C#

// (上記のPhysicsMovement.csの続き)

    public float jumpForce = 500f; // ジャンプの強さ
    
    // Update()はキー入力の検出に使う
    void Update()
    {
        // スペースキーが押された「瞬間」を判定
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Rigidbodyに上向き(Y軸)の力を一回だけ加える
            // ForceMode.Impulseを指定すると、瞬間的な力を加える(ジャンプに最適)
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }

❗️ 注意点:ジャンプしすぎの防止

このコードだけでは、空中で何度もジャンプできてしまいます。現実のゲームでは、「地面に接触しているか」を判定する仕組みを追加して、ジャンプ回数を制限する必要があります。


4. 🎮 Rigidbody移動の利点と使い分け

特徴transform.Translate (非物理)Rigidbody (物理ベース)
衝突他のオブジェクトを貫通する(Colliderは必要)。他のオブジェクトと衝突し、跳ね返る。
重力重力の影響を受けない。重力の影響を受ける。
制御完全にプログラマーの意図通りに動く。物理法則の影響を受け、慣性や摩擦が発生する。
用途UI要素、カメラ移動、エフェクトなど。プレイヤー、敵キャラクター、破壊可能なオブジェクトなど。

一般的に、プレイヤーや動的なオブジェクトRigidbodyを使うのがベストプラクティスです。

コメント