UnityにおけるRigidbodyコンポーネントは、ゲームオブジェクトに物理演算(Physics)のルールを適用するためのものです。Rigidbodyをアタッチすると、そのオブジェクトは重力の影響を受けたり、他のオブジェクトと衝突したときにリアルに跳ね返ったりするようになります。
1. 🛠️ Rigidbodyの追加
キー入力による移動を物理ベースに切り替えるには、まずオブジェクトにRigidbodyが必要です。
- 移動させたいゲームオブジェクト(例:Cube)を選択します。
- Inspectorビューの一番下にある「Add Component」をクリックします。
- 検索窓に「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を使うのがベストプラクティスです。

コメント