スポンサーリンク
Unity C#・スクリプト実装

【Unity】ジャンプ実装完全ガイド|通常ジャンプ・二段ジャンプ・壁ジャンプまで解説

Unity C#・スクリプト実装

Unityでアクションゲームを作り始めると、多くの人が最初に挑戦するのがジャンプ機能です。

ところが、実際に作ってみると意外と簡単にはいきません。

  • スペースキーを押したら飛べるようになったけど空中で何回もジャンプできる
  • 地面に着地しているはずなのにジャンプできない
  • 二段ジャンプを追加したら動作がおかしくなった
  • 壁ジャンプを作りたいけれど何から始めればいいのか分からない

こんな壁にぶつかることは珍しくありません。

私も最初にアクションゲームを作ったときは、「ジャンプはAddForceを1行書けば終わり」と思っていました。しかし実際には、ジャンプそのものよりも接地判定のほうが重要だったんです。

ジャンプ処理はひとつの機能に見えますが、内部では次のような仕組みが組み合わさっています。

  • 入力を受け取る
  • 地面に立っているか判定する
  • 上方向へ力を加える
  • 空中ジャンプ回数を管理する
  • 壁との接触を判定する

この流れを理解しておくと、通常ジャンプだけでなく、二段ジャンプや壁ジャンプも応用で作れるようになります。

アクションゲーム制作では避けて通れない基礎知識なので、ひとつずつ整理しながら見ていきましょう。


結論

Unityのジャンプ処理で最も重要なのは、ジャンプする処理そのものではなく接地判定です。

ジャンプボタンを押したときに上方向へ力を加えるだけなら数行のコードで実装できます。しかし、地面に立っている時だけジャンプを許可する仕組みがなければ、プレイヤーは空中で何度でも飛べてしまいます。

実際のアクションゲームでは、次のような流れでジャンプ処理を組み立てるのが一般的です。

  1. 地面に接触しているか判定する
  2. ジャンプ入力を受け取る
  3. 上方向へ力を加える
  4. 空中ジャンプ回数を管理する
  5. 必要に応じて壁ジャンプなどを追加する

接地判定にはいくつか方法がありますが、選び方の目安は次の通りです。

方法おすすめ用途
CollisionUnity学習や簡単なゲーム
Raycastアクションゲーム全般
CheckSphere安定性を重視する本格的なゲーム

二段ジャンプや壁ジャンプも、実は特別な機能ではありません。

接地判定や壁判定の結果を利用して、「今ジャンプしてよい状態か」を管理しているだけです。

そのため、まずは通常ジャンプと接地判定の仕組みを理解することが、アクションゲーム制作の近道になります。




Unityのジャンプ処理はRigidbodyが基本

Unityで物理演算を使ったジャンプを作る場合は、Rigidbodyを利用する方法が一般的です。

初心者の方の中には、Transform.positionを直接変更してキャラクターを上へ移動させようと考える人もいます。しかしアクションゲームでは、重力や落下との相性を考えるとRigidbodyを使うほうが自然な動きになります。

特に二段ジャンプや壁ジャンプを実装する予定があるなら、最初から物理演算ベースで作っておくほうが後々の拡張が楽になります。

UnityのジャンプはAddForceで実装する

まずはジャンプさせたいオブジェクトにRigidbodyコンポーネントを追加します。

その上で、ジャンプ入力を受け取ったときに上方向へ力を加えます。

using UnityEngine;

public class PlayerJump : MonoBehaviour
{
    public float jumpPower = 5f;

    private Rigidbody rb;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
        }
    }
}

ここで使っているForceMode.Impulseは、「瞬間的な力」を与えるモードです。

ジャンプは一瞬だけ強い力を加えたいので、Impulseとの相性が非常に良いです。

逆にForceMode.Forceを使うと力が徐々に加算されるため、思ったようなジャンプにならないことがあります。

私もUnityを始めたばかりの頃、ForceModeを意識せずに使っていて「なんだかジャンプが重たいな…」と悩んだ経験があります。ジャンプ処理ではImpulseを使うケースがほとんどです。

Unity 6で注意したいlinearVelocity

ジャンプ処理を調べていると、Rigidbody.velocityを変更するコードを見かけることがあります。

ただしUnity 6系では、従来のvelocityではなくlinearVelocityが使用される場面があります。

rb.linearVelocity = new Vector3(
    rb.linearVelocity.x,
    jumpPower,
    rb.linearVelocity.z
);

ただし、通常のジャンプ実装であればAddForceを使う方法が分かりやすく、物理挙動とも自然に連携できます。

まずはAddForceによるジャンプを理解し、その後でlinearVelocityを使った細かな制御を学ぶ流れがおすすめです。

次に理解したいのが、ジャンプ実装で最も重要な「接地判定」です。

ジャンプできる条件を正しく管理しないと、空中で何度も飛べる無限ジャンプが発生してしまいます。




Unityの接地判定はジャンプ実装の最重要ポイント

ジャンプ機能を作るとき、多くの人は「どうやって上に飛ばすか」を考えます。

しかし実際のゲーム開発では、いつジャンプを許可するかのほうが重要です。

ここを正しく作らないと、見た目はジャンプしているように見えてもゲームとして成立しなくなってしまいます。

なぜ接地判定が必要なのか

例えば、先ほどのジャンプコードをそのまま使うとどうなるでしょうか。

スペースキーを押すたびにAddForceが実行されるため、地面に立っているかどうかに関係なくジャンプできてしまいます。

つまり空中で何度でもジャンプできる状態になります。

これはよくある「無限ジャンプ」と呼ばれる状態です。

プレイヤーからすると空を飛べるので少し楽しいかもしれませんが、アクションゲームとしては想定外の動作になることがほとんどです。

そのため実際のゲームでは次のような条件を追加します。

  • 地面にいるときだけジャンプ可能
  • 空中ではジャンプ不可
  • 二段ジャンプの場合は1回だけ追加で許可

この判断を行うために必要なのが接地判定です。

接地判定で管理するisGroundedとは

接地判定では、キャラクターが地面に立っているかどうかを変数で管理することが一般的です。

よく使われるのがisGroundedというbool型の変数です。

private bool isGrounded;

bool型は「true」または「false」のどちらかを保持できます。

状態
地面に立っているtrue
空中にいるfalse

そしてジャンプ入力を受け取るときに、この値を確認します。

if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
    rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
}

このようにすると、地面に立っている場合だけジャンプできるようになります。

逆に言うと、接地判定が正しく動かなければ次のような問題が発生します。

  • ジャンプできない
  • 無限ジャンプになる
  • 二段ジャンプが正常に動かない
  • 壁ジャンプが不安定になる

二段ジャンプや壁ジャンプの実装で悩んでいる場合でも、原因をたどると接地判定の設定ミスだったというケースは珍しくありません。

まずは「地面に立っているかどうかを正しく判定する」という考え方を理解しておきましょう。




Unityの接地判定は3種類ある

接地判定にはいくつか実装方法があります。

どれも「地面に立っているかどうか」を判定するための仕組みですが、特徴や向いている用途が異なります。

まずはそれぞれの違いを理解して、自分のゲームに合った方法を選べるようになりましょう。

Collision判定の特徴

最もシンプルなのがCollisionを利用する方法です。

キャラクターと床が接触したタイミングで接地状態を管理します。

private bool isGrounded;

private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        isGrounded = true;
    }
}

private void OnCollisionExit(Collision collision)
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        isGrounded = false;
    }
}

実装が簡単なので、Unityを学び始めたばかりの方には非常に分かりやすい方法です。

ただし段差や複雑な地形では、接触判定が想定どおりに動かないことがあります。

小規模な学習用ゲームなら十分ですが、本格的なアクションゲームでは別の方法が採用されることも多くなります。

Raycast判定の特徴

Raycastは、キャラクターの足元から下向きに見えない光線を飛ばして地面を検出する方法です。

isGrounded = Physics.Raycast(
    transform.position,
    Vector3.down,
    1.1f
);

Raycastの大きなメリットは、判定を自分で細かく制御できることです。

  • どの方向に判定するか
  • どれくらいの距離を調べるか
  • どのレイヤーを対象にするか

を自由に設定できます。

また、Debug.DrawRayを使えばSceneビュー上で判定線を確認できるため、デバッグもしやすくなります。

Debug.DrawRay(
    transform.position,
    Vector3.down * 1.1f,
    Color.red
);

個人的にも、2D・3D問わずアクションゲームを作るならまずRaycastを覚えておく価値は高いと感じています。

接地判定だけでなく、壁判定や攻撃判定にも応用できるからです。

CheckSphere判定の特徴

CheckSphereは、足元に球状の判定領域を作って接地状態を調べる方法です。

isGrounded = Physics.CheckSphere(
    groundCheck.position,
    0.2f,
    groundLayer
);

Raycastは1本の線で判定しますが、CheckSphereは球体で判定します。

そのため、キャラクターが地面の端に立っている場合でも接地状態を検出しやすいという特徴があります。

近年のアクションゲームでは、RaycastよりもCheckSphereを採用するケースも少なくありません。

ただし判定範囲が広いため、半径設定が大きすぎると意図しない場所まで接地扱いになることがあります。

初心者はどの接地判定を選ぶべきか

方法実装難易度おすすめ用途
Collision学習用ゲーム
Raycastアクションゲーム全般
CheckSphere安定性重視のゲーム

もしこれからアクションゲームを本格的に作りたいなら、最初の学習としてCollisionを理解した後にRaycastへ進む流れがおすすめです。

接地判定の考え方が理解できれば、次に紹介する二段ジャンプもスムーズに実装できるようになります。




Unityの二段ジャンプはフラグ管理で実装する

通常ジャンプが完成したら、次に挑戦したくなるのが二段ジャンプです。

アクションゲームでは定番の機能ですが、実装の考え方は意外とシンプルです。

重要なのは「空中であと何回ジャンプできるか」を管理することです。

二段ジャンプの仕組み

初心者の方がよく勘違いするのですが、二段ジャンプは特別なジャンプ機能ではありません。

通常ジャンプに「空中で1回だけ追加ジャンプできる権利」を与えているだけです。

そのため、多くの場合はbool変数を使って管理します。

private bool doubleJump;

考え方としては次のようになります。

  • 地面にいる → 通常ジャンプ可能
  • 1回目のジャンプ後 → 空中ジャンプ許可
  • 2回目のジャンプ後 → 空中ジャンプ禁止
  • 着地したらリセット

この仕組みを理解すると、三段ジャンプや空中ダッシュなども応用で作れるようになります。

二段ジャンプ実装の流れ

実際の処理の流れを簡略化すると次のようになります。

if (Input.GetKeyDown(KeyCode.Space))
{
    if (isGrounded)
    {
        rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
        doubleJump = true;
    }
    else if (doubleJump)
    {
        rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
        doubleJump = false;
    }
}

地面にいる場合は通常ジャンプを実行します。

その直後にdoubleJumpをtrueへ変更して、「空中であと1回だけジャンプできる状態」を作ります。

空中で再びジャンプ入力が入った場合は二段ジャンプを実行し、その権利を消費するためdoubleJumpをfalseへ変更します。

そして着地したタイミングで再び初期状態へ戻します。

if (isGrounded)
{
    doubleJump = false;
}

実際のプロジェクトではboolではなくジャンプ回数を整数で管理することもありますが、二段ジャンプの学習段階ではboolのほうが理解しやすいでしょう。

よくある失敗例

二段ジャンプ実装で発生しやすいトラブルを見てみましょう。

無限ジャンプになる

最も多い原因は、doubleJumpをfalseへ戻していないケースです。

空中ジャンプ後もtrueのまま残っていると、何回でもジャンプできてしまいます。

着地後に二段ジャンプできない

着地時のリセット処理が正しく動いていない可能性があります。

接地判定が失敗していると、プレイヤーは着地したつもりでもプログラム上は空中判定のままになってしまいます。

ジャンプの高さがおかしくなる

二段ジャンプ時にAddForceを加算していると、想定より高く飛びすぎる場合があります。

ゲームによっては現在の上昇速度をリセットしてからジャンプ力を与える方法が採用されることもあります。

まずは「地面→空中→空中ジャンプ→着地リセット」という流れを正しく動かすことを優先しましょう。

二段ジャンプが理解できると、次は壁を利用して移動範囲を広げる壁ジャンプの仕組みも見えてきます。




Unityの壁ジャンプは壁判定を追加する

二段ジャンプができるようになると、次は壁ジャンプを実装したくなる方も多いと思います。

壁ジャンプはアクションゲームの移動の幅を大きく広げる仕組みです。

難しそうに見えますが、基本的な考え方はシンプルです。

「壁に触れていることを検知して、壁とは反対方向へ力を加える」だけです。

壁ジャンプの基本的な考え方

通常ジャンプとの大きな違いは、接地判定の代わりに壁判定を利用する点です。

例えばキャラクターが右側の壁に接触している場合は、左上方向へ飛ばします。

逆に左側の壁に接触している場合は、右上方向へ飛ばします。

イメージとしては次のような流れです。

  1. 壁に触れていることを検知する
  2. ジャンプ入力を受け取る
  3. 壁から離れる方向を計算する
  4. 上方向と横方向の力を加える

つまり、壁ジャンプは新しいジャンプ機能というよりも、接地判定を壁判定に置き換えた応用テクニックと考えると理解しやすくなります。

Raycastで壁を検知する方法

壁判定ではRaycastがよく使われます。

キャラクターの左右へRayを飛ばして、壁用レイヤーに当たったかを調べます。

bool wallRight =
    Physics.Raycast(
        transform.position,
        transform.right,
        0.6f,
        wallLayer
    );

bool wallLeft =
    Physics.Raycast(
        transform.position,
        -transform.right,
        0.6f,
        wallLayer
    );

このようにすると、右側の壁と左側の壁を別々に検知できます。

さらにLayerMaskを利用すると、壁以外のオブジェクトを無視できます。

地面やアイテムまで壁として認識してしまうトラブルを防げるため、実際の開発ではLayer設定を行うことが多いです。

また、Debug.DrawRayを利用して判定線を可視化すると調整しやすくなります。

壁ジャンプがうまく動かない原因

壁ジャンプで発生しやすいトラブルにはいくつか共通点があります。

壁レイヤーが設定されていない

Raycast自体は当たっていても、LayerMaskの対象外になっていると壁判定は成功しません。

まずは壁オブジェクトのLayer設定を確認しましょう。

Raycastの距離が短すぎる

キャラクターのコライダーサイズと比較して判定距離が短い場合、壁に触れているように見えても検出できないことがあります。

SceneビューでDebug.DrawRayを表示しながら調整すると原因を特定しやすくなります。

横方向の力が弱い

上方向の力だけが強く、横方向の力が弱いと真上へ飛んでしまいます。

壁ジャンプらしい動きにするためには、上方向と横方向のバランス調整が重要です。

壁ジャンプは数値調整によって操作感が大きく変わります。

同じコードでもゲームによって最適な値は異なるため、実際にプレイしながら調整していくのがおすすめです。

すでに通常ジャンプ・二段ジャンプ・壁ジャンプが実装済みのテンプレートを使いたい場合は、アクションゲーム向けのアセットも選択肢になります。

Corgi Engine

✅アセットストアでチェックする




Unityのジャンプ実装でよくあるエラーと対処法

ジャンプ処理は比較的シンプルな機能ですが、複数の仕組みが連携しているため、ひとつ設定が抜けるだけで正常に動かなくなることがあります。

ここでは開発中によく遭遇するトラブルと、その確認ポイントをまとめます。

ジャンプしない

ジャンプ入力をしているのに全く飛ばない場合は、まず基本設定を確認しましょう。

  • Rigidbodyが付いているか
  • Colliderが付いているか
  • Use Gravityが有効になっているか
  • ジャンプ処理が実行されているか

特に初心者の方は、スクリプトの問題だと思っていたらRigidbody自体が付いていなかったというケースが少なくありません。

まずはInspectorの設定から確認すると原因を見つけやすくなります。

接地判定が反応しない

ジャンプはできるのに、着地後の判定がおかしい場合は接地判定を疑いましょう。

Raycastを使っている場合は、判定距離が短すぎることがあります。

Physics.Raycast(
    transform.position,
    Vector3.down,
    0.1f
);

例えば身長2メートルのキャラクターに対して0.1fしか設定していない場合、地面まで届かない可能性があります。

Debug.DrawRayを使って実際の判定線を確認すると、原因が見つかりやすくなります。

また、LayerMaskを使用している場合は対象レイヤーの設定ミスもよくあります。

AddForceしても飛ばない

AddForceを書いているのにほとんど飛ばない場合は、ジャンプ力以外の設定が影響していることがあります。

  • Mass(質量)が大きすぎる
  • Dragが高すぎる
  • ジャンプ力が小さすぎる
  • ForceModeが適切でない

例えばMassが100になっているオブジェクトは、同じAddForceでもほとんど持ち上がりません。

まずはMassを1前後にして挙動を確認すると調整しやすくなります。

判定が不安定になる

接地判定が成功したり失敗したりする場合は、判定位置や判定範囲が適切でない可能性があります。

特にRaycastをキャラクターの中心から飛ばしている場合、コライダー形状によっては足元まで届かないことがあります。

また、CheckSphereを使う場合も半径が小さすぎると接地状態を見逃してしまいます。

私がアクションゲームを作るときは、まず判定を少し大きめに作り、その後で不要な判定が発生しない範囲まで徐々に調整しています。

いきなり完璧な値を探そうとするよりも、まず確実に判定できる状態を作るほうが開発効率は高くなります。

ジャンプ関連のトラブルは「入力」「接地判定」「物理設定」のどこかに原因があることがほとんどです。問題が発生したら、この3つを順番に確認してみてください。

ジャンプ機能を作り始めたばかりの頃は、正常な挙動と異常な挙動の違いが分かりにくいこともあります。次は初心者が特に勘違いしやすいポイントを整理していきましょう。




Unity初心者が勘違いしやすいポイント

ジャンプ処理は見た目がシンプルなため、「これで完成だろう」と思っていた部分に落とし穴が隠れていることがあります。

ここでは初心者の方が特につまずきやすいポイントを整理しておきましょう。

Rigidbodyだけではジャンプは完成しない

Rigidbodyを追加すると重力が働くようになるため、「あとはAddForceを書けば終わり」と思われがちです。

しかし実際のジャンプ処理には次の要素が必要です。

  • 入力処理
  • 接地判定
  • ジャンプ力の制御
  • 状態管理

例えば接地判定がなければ無限ジャンプになりますし、入力処理がなければジャンプは実行されません。

ジャンプは複数の仕組みが連携して初めて成立する機能だと考えると理解しやすくなります。

Raycastは上級者向けではない

Raycastという名前を見ると、「難しそうだから後回しにしよう」と感じる人もいます。

ですが実際には、RaycastはUnity開発で非常によく使われる基本機能です。

ジャンプの接地判定だけでなく、次のような場面でも利用されます。

  • クリック判定
  • 攻撃判定
  • 壁判定
  • NPCの視線判定
  • オブジェクト選択

早い段階で覚えておくと、後の開発がかなり楽になります。

Raycastについて詳しく知りたい場合は、こちらの記事も参考になります。

二段ジャンプはAddForceを2回呼ぶだけではない

二段ジャンプを実装するときに、単純にAddForceを2回実行しようと考える人もいます。

しかし本質はジャンプ回数の管理です。

もし回数管理がなければ、三段ジャンプや四段ジャンプになってしまいます。

二段ジャンプで重要なのは、空中でジャンプできる回数を制限する仕組みです。

アクションゲーム開発では、このような状態管理の考え方が頻繁に登場します。

壁ジャンプ専用機能は存在しない

Unityには「Wall Jump」という専用コンポーネントは用意されていません。

壁ジャンプは複数の機能を組み合わせて実現します。

  • Raycastで壁を検知する
  • 壁との接触状態を管理する
  • AddForceで跳ね返る力を与える

つまり、通常ジャンプ・接地判定・Raycastの知識があれば壁ジャンプも作れるということです。

最初は難しく見えるかもしれませんが、仕組みを分解して考えると意外とシンプルです。

アクションゲーム開発では「新しい機能を覚える」というより、「既に学んだ機能を組み合わせる」場面のほうが多くなります。

ジャンプ処理はその代表的な例と言えるでしょう。




まとめ

Unityのジャンプ処理は、単純にキャラクターを上へ飛ばすだけでは完成しません。

実際には接地判定や状態管理が組み合わさることで、自然なアクションゲームの操作感が生まれます。

今回紹介した内容を整理すると次のようになります。

  • 通常ジャンプはRigidbodyとAddForceで実装できる
  • 無限ジャンプを防ぐには接地判定が必要
  • 接地判定にはCollision・Raycast・CheckSphereがある
  • 二段ジャンプはジャンプ回数を管理して実現する
  • 壁ジャンプは壁判定とAddForceを組み合わせて作る

私自身も最初は「ジャンプさせるだけなのに難しいな」と感じていました。

ですが、接地判定の考え方を理解してからは、二段ジャンプや壁ジャンプ、空中ダッシュなどの機能も作りやすくなりました。

アクションゲーム開発では、今回紹介した知識が土台になります。

まずは通常ジャンプと接地判定をしっかり完成させ、その後に二段ジャンプや壁ジャンプへ発展させていくのがおすすめです。

さらにUnityの基礎を体系的に学びたい場合は、入門書を1冊手元に置いておくと理解が深まりやすくなります。

Unityの教科書 Unity 6完全対応版
✅ Amazonでチェックする✅ 楽天でチェックする

参考文献

よくある質問(FAQ)

Q
CharacterControllerでもジャンプできますか?
A

できます。

CharacterControllerには物理演算用のRigidbodyがないため、AddForceは使用できません。

代わりに、速度を自分で計算しながらMoveメソッドで移動させます。

CharacterControllerはFPSやTPSなどでよく利用されますが、ジャンプの挙動を細かく制御する必要があります。

まずはRigidbodyを使ったジャンプを理解してから挑戦すると、仕組みの違いが分かりやすくなります。

Q
RaycastとCheckSphereはどちらがおすすめですか?
A

どちらも実用的ですが、用途によって向き不向きがあります。

  • 制御しやすさ重視ならRaycast
  • 安定性重視ならCheckSphere

Raycastは判定距離や方向を細かく調整しやすく、壁判定や攻撃判定にも応用できます。

一方でCheckSphereは面で接地判定を行うため、段差や地面の端で安定しやすい傾向があります。

個人開発のアクションゲームであれば、まずRaycastを覚えておくと応用範囲が広がります。

Q
ジャンプの高さはどう調整すればいいですか?
A

基本的にはジャンプ力を表す変数を調整します。

public float jumpPower = 5f;

この数値を大きくすると高く飛び、小さくすると低く飛びます。

ただし、ジャンプの高さは次の設定にも影響されます。

  • RigidbodyのMass
  • Drag
  • 重力設定(Gravity)
  • AddForceのForceMode

思った高さにならない場合は、jumpPowerだけでなく物理設定も合わせて確認してみましょう。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク