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

①Actions アセットの設定(Jump を作る)
ボタン操作を設定するために、まずはInput Actionの追加をしていきます。
PlayerControls.inputactions
を開き、Action Map をPlayer
に- Actions に以下を用意
Jump
(Action Type: Button )
- Bindings を追加
- Keyboard:
Space
(スペースキーにジャンプ処理を設定します)
- Keyboard:


保存して閉じます。
②Player Input でイベントを結びつける
- Player Input のEvents を展開
- 「+」を押し、Playerオブジェクトをドラッグ
No Function
をクリックし、Player →
を選択_OnJump
これで「スペースキーが押されたら
_OnJump
が呼ばれる」ようになります📝
③ジャンプ処理を書く
Player.cs
に ジャンプ処理 を追加していきます📝
移動や向き変更と同じく、Update()
の中で毎フレーム状態をチェックし、入力があればジャンプできるようにします
フィールド変数の追加
[SerializeField, Header("接地判定用レイヤー(Floorなど)")]
private LayerMask _groundMask; // インスペクターでFloorを指定
private Vector2 _inputDirection;
private Rigidbody2D _rigid;
private bool _bJump;
private Collider2D _col; // 実寸取得用
_groundMask
は「床」と判定するレイヤーを指定します。インスペクターで Floor
レイヤーを選んでください。
Start
void Start()
{
_rigid = GetComponent<Rigidbody2D>();
_col = GetComponent<Collider2D>();
_bJump = false;
}
Collider2D
(プレイヤー自身に付いている当たり判定情報)を取得して変数に保存。_bJump
は「今ジャンプ中かどうか」を管理するフラグです。初期値はfalse
(ジャンプ可能)。
Update
void Update()
{
_Move();
_LookMoveDirec(); // 向きを変更
_HitFloor(); // 接地状態をチェック
}
Updateは毎フレーム呼び出されるUnityの共通機能です。
ここで _HitFloor()
を呼び出して、接地中かどうかを更新します。
_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;
}
}
- BoxCast で足元に薄い箱を飛ばし、床と接触しているかを確認します。
- BoxCastのサイズ調整
横幅を*0.9f
にしているのは、左右ギリギリを避けて誤判定を減らすため。
縦の大きさを小さくして「足元の薄い判定」としています。 grounded = true
→ 接地中(ジャンプできる)grounded = false
→ 空中(ジャンプ禁止)- これで「空中で無限ジャンプ」を防止できます。
_OnJump (ジャンプ処理)
public void _OnJump(InputAction.CallbackContext context)
{
// 入力が押された瞬間以外は無視 / 空中中は無視
if (!context.performed || _bJump) return;
// Rigidbodyに上方向の力を加える
_rigid.AddForce(Vector2.up * _jumpSpeed, ForceMode2D.Impulse);
// ジャンプ直後は空中扱いにして多段ジャンプを防ぐ
_bJump = true;
}
context.performed
… 入力が「押された瞬間」だけ反応します。_bJump
がtrue
のとき(空中)は処理をスキップ。AddForce
を Impulseモード で使うことで、初速を一気に与えて自然なジャンプ挙動になります。
④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
(ジャンプ不可)。 _OnJump
でtrue
にしておくと二段ジャンプが防げます。
- 接地時は
- Impulse
- 初速をドンと与えるため、ジャンプの手触りが自然になります。
⑥動作確認
- 床オブジェクトに Floorレイヤー を設定
- Playerのインスペクターで Ground Mask = Floor に指定
- 再生して Spaceキーを押す
- 接地中:ジャンプできる
- 空中:何度押しても無視される

重力の調整
👉Rigidbody2D→Gravity Scale を大きくすると、重力が強くなり落下が速くなります。
⑦よくあるつまずき
- ジャンプできない
Floor
レイヤーが存在しない or 床のColliderが別レイヤー。
- 無限ジャンプできてしまう
_OnJump
で_bJump = true;
を書いていない。
- 判定がシビアすぎる / 床に触れても反応しない
BoxCast
のサイズや距離を0.05f〜0.15f
くらいで微調整。
⑧まとめ
BoxCast
を使った接地判定で無限ジャンプを防止_bJump
フラグで空中中はジャンプ不可に制御- Input Systemでシンプルに「押した瞬間だけ」ジャンプ実行
これで無限ジャンプを防いだ基本ジャンプ処理が完成です!
次はいよいよマップ作成の解説をします!
コメント