11.

Unity で重力を変更する方法 — Physics.gravity / Rigidbody / 2D 対応

編集
この記事の要点
  • Unity の重力は Project Settings → Physics → Gravity で全体設定 (デフォルト Y=-9.81)
  • スクリプトから動的に変える場合は Physics.gravity = new Vector3(0, -20f, 0);
  • 個別オブジェクトの重力は Rigidbody.useGravity で ON/OFF、Mass は重力に影響しない
  • 2D は別系統: Physics2D.gravity / Rigidbody2D.gravityScale
  • 無重力ステージ / 月面 / ジャンプ調整 / 浮力 など演出に活用

Unity の重力モデル

Unity の物理エンジンは PhysX (3D)Box2D ベース (2D) の 2 系統で、重力はそれぞれ別管理です。デフォルトの 3D 重力は Vector3(0, -9.81, 0) で、地球の表面重力 (約 9.81 m/s²) に相当します。

1. Project Settings から全体変更

  1. Edit → Project Settings を開く
  2. 左ペインから Physics を選択
  3. Gravity の値を変更 (例: 月面なら Y=-1.62)

2D の場合は Physics 2D タブの Gravity を変更します。

2. スクリプトから動的変更

using UnityEngine;

public class GravityController : MonoBehaviour {
    void Start() {
        // 重力を 2 倍に強化 (落下が速くなる)
        Physics.gravity = new Vector3(0, -19.62f, 0);
    }

    public void ToMoon() {
        // 月面相当
        Physics.gravity = new Vector3(0, -1.62f, 0);
    }

    public void ZeroG() {
        // 無重力
        Physics.gravity = Vector3.zero;
    }

    public void Reverse() {
        // 上下反転 (天井に落ちる)
        Physics.gravity = new Vector3(0, 9.81f, 0);
    }
}

3. Rigidbody 単位での重力制御

全体の Gravity ではなく このオブジェクトだけ重力 OFF にしたい場合:

Rigidbody rb = GetComponent();

// 重力を無効化 (浮遊させる)
rb.useGravity = false;

// 自前で力を加える
rb.AddForce(Vector3.up * 5f, ForceMode.Acceleration);

// 速度を直接セット
rb.velocity = new Vector3(0, 2f, 0);
項目意味
useGravityこのオブジェクトに重力を適用するか
mass質量 (kg)。落下速度には影響しない (ガリレオの原理)
drag空気抵抗。大きいほど落下が遅くなる
isKinematictrue で物理影響を完全に切る (手動制御)

4. 2D ゲームの重力

2D では Physics2DRigidbody2D.gravityScale を使います。

// 全体重力 (2D)
Physics2D.gravity = new Vector2(0, -20f);

// 個別 (Rigidbody2D)
Rigidbody2D rb2d = GetComponent();
rb2d.gravityScale = 1f;    // 1 = 全体重力どおり
rb2d.gravityScale = 0f;    // 重力なし
rb2d.gravityScale = 3f;    // 3 倍重い感触 (シビアな落下)
rb2d.gravityScale = -1f;   // 逆向き (上に浮く)

5. ジャンプ感を調整するレシピ

ゲーム的に気持ち良いジャンプは 現実の重力よりかなり強め がコツです。

public class JumpFeel : MonoBehaviour {
    [SerializeField] private float jumpVelocity = 8f;
    [SerializeField] private float fallMultiplier = 2.5f;   // 落下時は重力を強める
    [SerializeField] private float lowJumpMultiplier = 2f;  // ボタン離しで小ジャンプ

    Rigidbody rb;
    void Awake() { rb = GetComponent(); }

    void Update() {
        if (Input.GetButtonDown("Jump")) {
            rb.velocity = new Vector3(rb.velocity.x, jumpVelocity, rb.velocity.z);
        }

        // 落下中: 重力を強める
        if (rb.velocity.y < 0) {
            rb.velocity += Vector3.up * Physics.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
        }
        // ジャンプ中にボタン離し: 重力を強める
        else if (rb.velocity.y > 0 && !Input.GetButton("Jump")) {
            rb.velocity += Vector3.up * Physics.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
        }
    }
}

6. 水中 / 浮力ステージ

Trigger Collider で「水中エリア」を作り、内部に入った Rigidbody の重力を弱めます。

public class WaterZone : MonoBehaviour {
    void OnTriggerEnter(Collider other) {
        var rb = other.GetComponent();
        if (rb) {
            rb.useGravity = false;
            rb.drag = 5f;             // 抵抗を増やす
            rb.AddForce(Vector3.up * 3f, ForceMode.Acceleration); // 浮力
        }
    }
    void OnTriggerExit(Collider other) {
        var rb = other.GetComponent();
        if (rb) {
            rb.useGravity = true;
            rb.drag = 0f;
        }
    }
}

よくあるトラブル

症状原因対処
重力を変えても落ちないRigidbody 未追加 / isKinematic = trueRigidbody 追加、isKinematic を false
重さを変えても落下速度が同じ仕様。mass は落下速度に無関係drag や AddForce で調整
2D で重力が効かない3D の Physics.gravity を変更してるPhysics2D.gravity を変更
Editor 終了後も重力が残る静的変数は保持されない (実は次回起動でリセット)Project Settings で恒久変更

FAQ

Q: 重力方向を横向きにできる?
A: はい。Physics.gravity = new Vector3(-9.81f, 0, 0); で左方向。VR の「壁を歩く」演出にも使えます。

Q: ParticleSystem に重力は効く?
A: ParticleSystem の Gravity Modifier プロパティが効きます。1.0 で Physics.gravity に追従。

Q: キャラだけ違う重力にできる?
A: useGravity を切り、毎 FixedUpdate で rb.AddForce(独自重力, ForceMode.Acceleration); を加算します。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Unityの導入方法
  2. エディタ(画面)の説明
  3. プロジェクトの作成と削除
  4. オブジェクト
  5. コンポーネント
  6. スクリプト
  7. アセットのインポート方法
  8. ゲームの実行/一時停止/コマ送り
  9. パッケージのインポート
  10. ゲームの公開(Build)方法
  11. 重力の変更
  12. 用語集
  13. エラー一覧
  14. おすすめアセット一覧