学習記事一覧 · Unityクラス

【学習】Rigidbody2D クラス(物理演算)

Unity 入門シリーズでは、

  • 当たり判定に Rigidbody2D を設定した
  • AddForce でジャンプを実装した

という形で物理演算を学びました。

しかし、Rigidbody2D には他にも重要なプロパティやメソッドがあります。

Rigidbody2D クラス

の主な API をまとめて押さえましょう。

今回は Rigidbody2D のよく使うプロパティとメソッドを解説します。

今日学ぶこと

  • velocity … 速度を直接設定する
  • AddForce … 力を加える
  • Body Type … Dynamic、Kinematic、Static
  • gravityScale … 重力の強さ
  • constraints … 回転・移動の固定

Rigidbody2D とは

Rigidbody2D は、2D の物理演算を適用するコンポーネントです。重力や衝突の影響を受けます。GetComponent で取得して使います。

private Rigidbody2D rb;

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

velocity(速度)

velocity は、オブジェクトの現在の速度(Vector2)です。直接設定すると、その速度で動きます。

// 左右に移動(Y はそのまま=ジャンプ中も維持)
rb.velocity = new Vector2(moveX * speed, rb.velocity.y);

// 完全に止める
rb.velocity = Vector2.zero;

AddForce より即効性があり、入力に素直に反応します。横スクロールのプレイヤー移動でよく使います。


AddForce(力を加える)

AddForce は、オブジェクトに力を加えます。慣性があるため、徐々に加速します。

// 右方向に力を加える
rb.AddForce(new Vector2(10, 0));

// ジャンプ(瞬間的に力を加える)
rb.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);
ForceMode2D 説明
Force 質量を考慮した連続的な力(デフォルト)
Impulse 瞬間的に速度を加える。ジャンプに適している

Body Type(挙動の種類)

Inspector の Body Type で、物理演算の挙動を変えられます。

Body Type 説明 用途
Dynamic 重力・衝突の影響を受ける プレイヤー、落下物、弾
Kinematic スクリプトで動かす。物理の影響を受けない 動く床、エレベーター
Static 動かない。当たり判定のみ 壁、床
// スクリプトから変更(あまりしない)
rb.bodyType = RigidbodyType2D.Dynamic;

gravityScale(重力の強さ)

gravityScale は、重力の倍率です。0 にすると重力がかかりません。

rb.gravityScale = 0;   // 重力なし(横スクロールのプレイヤーなど)
rb.gravityScale = 1;   // デフォルトの重力
rb.gravityScale = 2;   // 2倍の重力

constraints(固定)

constraints で、回転や特定軸の移動を固定できます。

// Z 軸の回転を固定(2D でキャラが傾かないように)
rb.constraints = RigidbodyConstraints2D.FreezeRotation;

// X 軸の移動も固定する場合
rb.constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezeRotation;
定数 説明
None 固定なし
FreezePositionX X 方向の移動を固定
FreezePositionY Y 方向の移動を固定
FreezeRotation 回転を固定

完成コード例(velocity で移動+ジャンプ)

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMove : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private float jumpForce = 12f;

    private Rigidbody2D rb;
    private Vector2 moveInput;

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

    void OnMove(InputValue value)
    {
        moveInput = value.Get<Vector2>();
    }

    void OnJump(InputValue value)
    {
        if (value.isPressed)
        {
            rb.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);
        }
    }

    void Update()
    {
        float moveX = moveInput.x * speed;
        rb.velocity = new Vector2(moveX, rb.velocity.y);
    }
}

重要ポイント

Rigidbody2D は 2D の物理演算を担当します。

  • velocity … 速度を直接設定。入力に素直に反応
  • AddForce … 力を加える。Impulse でジャンプ
  • Body Type … Dynamic(動く)、Kinematic(スクリプトで動かす)、Static(動かない)
  • gravityScale … 0 で重力なし
  • constraints … 回転や軸の移動を固定

発展アイデア

  • FixedUpdate … 物理演算は FixedUpdate で行うと安定しやすい(Update でも動く)
  • MovePosition … Kinematic で滑らかに移動する
  • OnCollisionEnter2D … 衝突時の処理

Rigidbody2D は 物理演算の要 です。当たり判定と組み合わせてゲームの動きを作ります。