キャラクターが落下したり、ジャンプしたりする動き。
重力計算を使えば、自然な物理挙動を実現できます。
重力計算は、重力加速度によって、オブジェクトの速度と位置を更新する処理です。
ゲーム開発では、落下やジャンプなどの物理挙動の基礎として使われます。
この記事では、重力計算をゲームで扱う考え方を、Unity実装例とともに解説します。
- 重力計算の方法が分からない…
- 落下やジャンプの物理挙動を実装したい。
- 重力加速度をどう使えばいいか理解できない。
✨ この記事でわかること
- 重力計算の基本となる重力加速度
- 重力による速度と位置の更新方法
- ジャンプの初速度と落下の実装
- Unityでの重力計算の実装手順とコード例
- 初心者でも理解できる物理演算の基礎
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます
重力計算とは何か(ゲーム制作目線)

重力計算は、重力加速度によって、オブジェクトの速度を変化させ、位置を更新する処理です。
現実世界では、重力によって物体が落下しますが、ゲームでも同じ物理法則を適用できます。
重力加速度を速度に加算し、速度で位置を更新すれば、自然な落下を実現します。
重力計算の基本要素は、以下の3つです。
- 重力加速度:下向きの加速度(通常は-9.81 m/s²)
- 速度の更新:重力加速度によって速度を更新
- 位置の更新:速度によって位置を更新
Unityでは、Time.deltaTimeを使った積分計算で実現します。
ゲームでの具体的な使い道

重力計算が、ゲームでどう使われているか確認してみましょう。
キャラクターの落下
キャラクターが空中にいる時、重力によって落下します。
ジャンプした後、重力加速度によって速度が下向きに増加し、落下します。
ジャンプの実装
ジャンプ時は上向きの初速度を与え、その後重力によって落下します。
初速度と重力の組み合わせで、放物線を描きます。
プロジェクタイルの軌道
弾やミサイルが発射されると、重力によって放物線を描きます。
初速度と重力加速度で、自然な軌道ができます。
物理演算での落下
Rigidbodyを使った物理演算でも、重力が自動的に適用されます。
Unityの物理エンジンが、重力計算を自動的に行います。
重力計算が使われる場面
- キャラクターの落下と着地
- ジャンプの実装
- プロジェクタイルの軌道計算
- 物理演算でのオブジェクトの落下
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
重力計算の核心|加速度・速度・位置が連鎖する仕組み

ゲーム内での重力は、単に「キャラクターを下に移動させる処理」ではありません。
本質は、加速度が速度を変え、速度が位置を変えるという「積分の連鎖」にあります。
この仕組みを理解するために、毎フレーム実行される内部処理をステップごとに分解してみましょう。
1. 重力加速度による「速度」の更新
まず、物理的な力である「重力加速度」をキャラクターの「現在の速度」に加算します。
重力加速度は通常、下向きの定数(Unityでは $-9.81 m/s^2$)として扱われます。
この処理により、キャラクターが空中にいる間、下向きの速度は毎フレーム着実に加算され(増幅し)続けます。
- 重力加速度:常に一定の下向きの力(例:$-9.81$)
- 速度の変化量:重力加速度 $\times$ 経過時間(
Time.deltaTime) - 新しい速度:現在の速度 $+$ 速度の変化量
2. 更新された速度による「位置」の移動
次に、先ほど計算した「新しい速度」を使って、キャラクターの座標(トランスフォーム)を更新します。
速度とは「単位時間あたりの移動量」のことです。
たとえ重力加速度が一定でも、速度が毎フレーム蓄積されていくため、結果として「落下すればするほど移動距離が伸びる(加速する)」という自然な挙動が生まれます。
- 位置の変化量:速度 $\times$ 経過時間(
Time.deltaTime) - 新しい位置:現在の位置 $+$ 位置の変化量
3. ジャンプの原理と「放物線」の形成
ジャンプの実装は、この重力計算のループに「一瞬の初速度」を与えるだけで完成します。
上向きの初速度を与えると、重力によって少しずつその勢いが削られていく様子が再現されます。
頂点に達した瞬間に速度が $0$ になり、そこから負の速度(落下)に転じることで、美しい放物線が描かれるのです。
- ジャンプの瞬間:上向きの大きな初速度(例:$+5.0$)を一度だけ代入
- 空中での推移:重力が毎フレーム速度を減らし、やがて下向きの落下に転じる
- 物理の醍醐味:計算式を書き換えなくても、初期値だけで自然な軌道が生まれる
4. 着地判定と状態のリセット
デジタルの世界では、計算の誤差やフレームレートの影響で、キャラクターが地面を突き抜けて(めり込んで)しまうことがあります。
そのため、着地した瞬間に物理状態を「静止」に書き換える処理が不可欠です。
地面に触れたら、それまで蓄積された落下速度をクリアすることで、次のジャンプや移動に備えます。
- めり込み補正:キャラクターの $Y$ 座標が地面以下になったら、強制的に地面の高さ($0$ など)に固定する
- 速度の初期化:下向きの速度を $0$ にリセットする(これを忘れると地面にいても重力が蓄積し続けるため注意)
- 接地フラグ:地面にいる状態(
isGrounded)をtrueにし、再ジャンプを可能にする
- 速度 → 位置の順で計算: これは「オイラー法」と呼ばれる数値積分の一種です。重力(加速度)が速度を変え、その結果として位置が変わるという因果関係をコードに反映しています。
- Time.deltaTime の役割: フレームレートが変動しても、1秒間の落下距離を一定に保つための「重み付け」として機能します。
- リセットの重要性: 着地時に速度を $0$ にしないと、地面に立っている間も内部では「超高速で落下しようとする力」が溜まり続け、次に崖から落ちた瞬間にワープしたような挙動になってしまいます。
Unityで実装する際の注意点(代表例)

Unityで重力計算を実装する場合の注意点を見ていきましょう。
基本的な重力による落下
最もシンプルな重力計算の実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Gravity : MonoBehaviour { private Vector3 velocity = Vector3.zero; public float gravity = -9.81f; // 重力加速度 void Update() { // 重力加速度を速度に加算 velocity.y += gravity * Time.deltaTime; // 速度で位置を更新 transform.position += velocity * Time.deltaTime; } } |
ジャンプの実装
ジャンプの初速度と、重力による落下を組み合わせた実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public class Jump : MonoBehaviour { private Vector3 velocity = Vector3.zero; public float gravity = -9.81f; public float jumpSpeed = 5f; // ジャンプの初速度 private bool isGrounded = false; void Update() { // ジャンプ入力(地面にいる時のみ) if (Input.GetKeyDown(KeyCode.Space) && isGrounded) { velocity.y = jumpSpeed; isGrounded = false; } // 重力加速度を適用 velocity.y += gravity * Time.deltaTime; // 位置を更新 transform.position += velocity * Time.deltaTime; // 地面との衝突判定 if (transform.position.y <= 0) { transform.position = new Vector3(transform.position.x, 0, transform.position.z); velocity.y = 0; isGrounded = true; } } } |
Rigidbodyを使った重力
Unityの物理演算エンジンを使った実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class RigidbodyGravity : MonoBehaviour { private Rigidbody rb; void Start() { rb = GetComponent(); // Unityの物理エンジンが自動的に重力を適用 // Physics.gravityで重力の値を変更可能 } void Update() { // ジャンプ入力 if (Input.GetKeyDown(KeyCode.Space)) { rb.AddForce(Vector3.up * 5f, ForceMode.Impulse); } } } |
カスタム重力の実装
重力の方向や強さをカスタマイズできる実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class CustomGravity : MonoBehaviour { private Vector3 velocity = Vector3.zero; public Vector3 gravityDirection = Vector3.down; // 重力の方向 public float gravityStrength = 9.81f; // 重力の強さ void Update() { // カスタム重力加速度を計算 Vector3 gravity = gravityDirection.normalized * gravityStrength; // 速度を更新 velocity += gravity * Time.deltaTime; // 位置を更新 transform.position += velocity * Time.deltaTime; } } |
重力無効化の実装
特定の条件で重力を無効化する実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class ConditionalGravity : MonoBehaviour { private Vector3 velocity = Vector3.zero; public float gravity = -9.81f; public bool useGravity = true; // 重力を使用するか void Update() { // 重力を使用する場合のみ適用 if (useGravity) { velocity.y += gravity * Time.deltaTime; } transform.position += velocity * Time.deltaTime; } // 重力を無効化(例:反重力アイテム取得時) public void DisableGravity() { useGravity = false; } } |
プロジェクタイルの重力
発射されたプロジェクタイルに重力を適用する実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class ProjectileGravity : MonoBehaviour { private Vector3 velocity; public float gravity = -9.81f; public void Launch(Vector3 initialVelocity) { velocity = initialVelocity; } void Update() { // 重力をY軸に適用 velocity.y += gravity * Time.deltaTime; // 位置を更新 transform.position += velocity * Time.deltaTime; // 地面に着いたら削除 if (transform.position.y < 0) { Destroy(gameObject); } } } |

まとめ

この記事では、重力計算について見てきました。
重要なポイントをおさらいします。
重要なポイント:
- 重力加速度は下向きで、速度を減少させる
- Time.deltaTimeを使った積分計算で実現
- ジャンプ時は初速度を与え、その後重力が作用
- 着地時は速度をリセットする必要がある
- UnityのRigidbodyは、自動的に重力を適用する
重力計算は、ゲーム開発で頻繁に使われる重要な技術です。
落下やジャンプなどの物理挙動を実現するために、欠かせません。
シンプルな計算で、自然な物理挙動を実現できます。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、重力計算を含む物理演算を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント