【Unity入門④】プレイヤーをジャンプさせる処理を作ろう!

Unity2D入門(シリーズ)

前回はプレイヤーの向き変更を実装しました。今回は ジャンプを作っていきます!

ジャンプ処理自体はシンプルに作れますが、ジャンプ後の制御も行わないと空中でも無限ジャンプできてしまいます。
この記事では 「接地中だけジャンプ可能」 な仕組みを作る方法を紹介します!
まずは InputAction を設定してから、スクリプト側に処理を書いていきます📝

↓実装イメージ↓


①Actions アセットの設定(Jump を作る)

ボタン操作を設定するために、まずはInput Actionの追加をしていきます。
スペースキーを押したらジャンプするように設定していきます。

  1. PlayerControls.inputactions を開き、Action MapPlayer
  2. Actions に以下を用意
    • Jump(Action Type: Button
  3. Bindings を追加
    • Keyboard: Space(スペースキーにジャンプ処理を設定します)

保存して閉じます。


②Player Input でイベントを結びつける

  1. Player Input のEvents を展開
    • 「+」を押し、Playerオブジェクトをドラッグ
    • No Function をクリックし、Player → _OnJumpを選択

これで「スペースキーが押されたら _OnJumpが呼ばれる」ようになります📝


③ジャンプ処理を書く

Player.csジャンプ処理 を追加していきます📝
移動や向き変更と同じく、Update() の中で毎フレーム状態をチェックし、入力があればジャンプできるようにします。

public class Player : MonoBehaviour
{   
    [SerializeField, Header("ジャンプ速度")]
    private float _jumpSpeed;
    
    [SerializeField, Header("接地判定用レイヤー(Floorなど)")]
    private LayerMask _groundMask;   // インスペクターでFloorを指定

    private bool _bJump;
    private Collider2D _col;         // 実寸取得用
    
    void Start()
    {
        _col = GetComponent<Collider2D>();
        _bJump = false;
    }
    
    void Update()
    {
        _HitFloor();
    }
    
    // 今床に触れているか、空中状態か判定する
    private void _HitFloor()
    {
        // もしプレイヤーのColliderが存在しなければ処理しない
        if (_col == null) return;

        // 接地判定のためのBoxCast(四角形の当たり判定を下に飛ばす)を準備する

        // プレイヤーのコライダーの範囲を取得
        Bounds b = _col.bounds;
        // 判定を出す位置(プレイヤーの足元より少し下に設定)
        Vector2 center = new Vector2(b.center.x, b.min.y - 0.05f);
        // 判定の大きさ(横幅はキャラより少し小さめ、高さはごく薄い矩形)
        Vector2 size = new Vector2(b.size.x * 0.9f, 0.12f);

        // BoxCastを実行
        // ・center:判定の中心位置
        // ・size  :判定の大きさ
        // ・0f    :角度は回転なし
        // ・Vector2.down:真下に向けて判定
        // ・0.05f :判定を飛ばす長さ(わずかに下へ伸ばす)
        // ・_groundMask:Floorなど「地面」とするレイヤーにだけ反応させる
        RaycastHit2D hit = Physics2D.BoxCast(center, size, 0f, Vector2.down, 0.05f, _groundMask);

        // 当たり判定の情報取得
        bool grounded = (hit.collider != null);

        // 地面と触れたか確認
        if (grounded)
        {
            // 地面にいる → ジャンプ可能
            _bJump = false;
        }
        else
        {
            // 空中にいる → ジャンプ不可
            _bJump = true;
        }
    }
    // ジャンプ処理
    public void _OnJump(InputAction.CallbackContext context)
    {
        // 押下(performed)でなければ無視 / 空中なら無視
        if (!context.performed || _bJump) return;

        // Impulse:初速が早く徐々に減速、Force:初速が遅く、徐々に加速
        _rigid.AddForce(Vector2.up * _jumpSpeed, ForceMode2D.Impulse);

        // 連打での多段を防ぐために即座に空中扱い
        _bJump = true;
    }
}

  • Updateで毎フレーム _HitFloor() を呼び出して、今着地しているかどうかを判定します。
  • BoxCastを使用しキャラの足元が床に触れたか、当たり判定を調べています
  • _groundMask は「床」と判定するレイヤーを指定します。後の手順④で解説していますが、インスペクターで Floor レイヤーを選びます。

💡各処理の詳しい説明は以下の記事で解説しています。ご興味あれば覗いてみてください🦖

④Floor レイヤーの作成

新しいレイヤーを作る

  • どのオブジェクトでもいいのでクリックし、「Inspector」ウィンドウを確認
  • 「Layer」の右端にあるプルダウンをクリック → 一番下の 「Add Layer…」 を選びます。
  • インスペクターが Tags & Layers の設定画面に切り替わります。
  • 「User Layer 8」や「User Layer 9」など、空いている欄があります。

➡️ その空欄に Floor と入力してください。
(大文字・小文字は区別されないですが、コードと統一した方が安全です)


床オブジェクトに Floor レイヤーを割り当てる

  • Hierarchy 上で床となるオブジェクトを選択。
  • Inspector の Layer プルダウンから、今作成した Floor を選びます。

Ground MaskにFloorレイヤーを割り当てる

  • Playerオブジェクトを選択
  • Ground Maskに今作成した Floor を選びます。

ここまで設定したらジャンプ処理の完成です📝

⑤ポイント解説

  • BoxCastで接地判定
    • 足元に薄い箱を飛ばして床と接触しているかを確認します。
    • hit.collider != null → 接地 / null → 空中。
  • _bJumpフラグ
    • 接地時は false(ジャンプ可能)、空中は true(ジャンプ不可)。
    • _OnJumptrue にしておくと二段ジャンプが防げます。
  • Impulse
    • 初速をドンと与えるため、ジャンプの手触りが自然になります。

動作確認

  1. 床オブジェクトに Floorレイヤー を設定
  2. Playerのインスペクターで Ground Mask = Floor に指定
  3. 再生して Spaceキーを押す
    • 接地中:ジャンプできる
    • 空中:何度押しても無視される

重力の調整
➡️Rigidbody2D→Gravity Scale を大きくすると、重力が強くなり落下が速くなります。


⑦よくあるつまずき

  • ジャンプできない
    • Floor レイヤーが存在しない or 床のColliderが別レイヤー。
  • 無限ジャンプできてしまう
    • _OnJump_bJump = true; を書いていない。
  • 判定がシビアすぎる / 床に触れても反応しない
    • BoxCast のサイズや距離を 0.05f〜0.15f くらいで微調整。

まとめ

  • BoxCast を使った接地判定で無限ジャンプを防止
  • _bJump フラグで空中中はジャンプ不可に制御
  • Input Systemでシンプルに「押した瞬間だけ」ジャンプ実行

これで無限ジャンプを防いだ基本ジャンプ処理が完成です!
次はいよいよマップ作成の解説をします!

コメント

タイトルとURLをコピーしました