Unityの2Dゲームで「速度を判定してジャンプ制御」を実装していきます。
オブジェクトの速度を確認することで、「停止中・上昇中・下落中などでジャンプが出来る」の制御します。
はじめに
Unityのバージョンは2021.3.14f1です。
2Dゲームで「すごく簡単にプレイヤーのジャンプ制御」を実装していきます。2段ジャンプができるタイミングを制御する感じですね。
下記のRaycastを飛ばすよりも簡単に実装できます。
実装開始
「UI作成」→「判定追加(スクリプト)」の順番で行います。
プレイヤーと地面を作成
まずは簡単に画面を作成します。「2D Object」→「Sprites」→「Square」を2つ追加。

一つは「Player」に名前を変更、「BoxCollider 2D」と「Rigidbody 2D」をアタッチします。

もう一つはGroundに名前を変更してスケールとSpriteRendererの色を変更、「BoxCollider 2D」をアタッチします。

下記の様な感じにします。白い四角がプレイヤー、黒い下部分が床ですね。

この状態で実行すると、白いプレイヤーにrigidbodyをアタッチしてあるので落下します。
プレイヤーのジャンプスクリプト
PlayerJumpと言う名前で下記スクリプトを作成します。
using UnityEngine; public class PlayerJump : MonoBehaviour { private float jumpPower = 5.0f; private Rigidbody2D _rigidbody; void Start() { _rigidbody = GetComponent<Rigidbody2D>(); } void Update() { if (Input.GetKey(KeyCode.Space)) _rigidbody.velocity = new Vector2(0, jumpPower); } }
スペースキーを押した時、ジャンプするという簡単なものです。
このスクリプトをPlayerにアタッチして実行してみます。

スペースキーを押すとジャンプします。何度も押すとドンドン上に行きます。
速度によって制御する
スクリプトのUpdate内を下記のように変更してみます。
void Update() { if (Input.GetKey(KeyCode.Space) && _rigidbody.velocity.y == 0) _rigidbody.velocity = new Vector2(_rigidbody.velocity.x, jumpPower); }
「_rigidbody.velocity.y == 0(速度のY軸が0)」はプレイヤーが上昇中でも下落中でない状態ですね。
スペースキーを押し続けても、下記のように地面に着地するまでは有効にならず2段ジャンプをしなくなります。

上昇中はNG、下降中はOKなら条件を下記の様な感じに。
if (Input.GetKey(KeyCode.Space) && _rigidbody.velocity.y <= 0)
絶対値(Mathf.Abs)を利用して、設定値以下の場合はOKとかも簡単に出来ますね。とはいえ、簡易的な感じですかね。