タイトル: 重力の変更
SEOタイトル: Unity で重力を変更する方法 — Physics.gravity / Rigidbody / 2D 対応
| この記事の要点 |
|
Unity の重力モデル
Unity の物理エンジンは PhysX (3D) と Box2D ベース (2D) の 2 系統で、重力はそれぞれ別管理です。デフォルトの 3D 重力は Vector3(0, -9.81, 0) で、地球の表面重力 (約 9.81 m/s²) に相当します。
1. Project Settings から全体変更
- Edit → Project Settings を開く
- 左ペインから Physics を選択
- 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 | 空気抵抗。大きいほど落下が遅くなる |
isKinematic | true で物理影響を完全に切る (手動制御) |
4. 2D ゲームの重力
2D では Physics2D と Rigidbody2D.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 = true | Rigidbody 追加、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); を加算します。
📸 参考画像
※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。
