今回はUnity2Dで「ためてジャンプ」を実装していきます。スペースキーを押したらジャンプしますが、キーを押した時間の長さによってジャンプ力が変わるものです。
はじめに
Unityのバージョンは2021.3.14f1です。
スペースキーを押している間は力をためて、離した時にジャンプをするのを実装していきます。
実装開始
まずは、スペースキーを押したら普通にジャンプするのを作成して、スペースキーの押した時間の長さによってジャンプ力が変わるのを実装していきます。
ジャンプ機能の作成
Hierarchyで右クリックして、「2DObject」→「Sprites」→「Square」を2つ追加。

1つ目は名前をplayerに変更して、Positionを変更。BoxCollider2DとRigidbody2Dをアタッチします。

2つ目はLayerをGroundに変更して、Position、Scaleを変更。BoxCollider2Dをアタッチ。SpriteRendererの色を変更して床にします。

ゲーム画面が下記の様な感じになるように床を適当に配置します。

スクリプトの作成
下記スクリプトを作成します。横移動とジャンプですね。
using UnityEngine;
public class jump : MonoBehaviour
{
[SerializeField] private LayerMask groundLayer;
private float PlayerSpeed = 5.0f;
private float JumpPower = 20.0f;
private Rigidbody2D _rb;
private void Start()
{
_rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
float InputX = Input.GetAxisRaw("Horizontal");
if (Input.GetKey(KeyCode.Space) && isGrounded())
_rb.velocity = new Vector2(_rb.velocity.x, JumpPower);
_rb.velocity = new Vector2(InputX * PlayerSpeed, _rb.velocity.y);
}
private bool isGrounded()
{
Collider2D hit = Physics2D.OverlapBox(
new Vector2(transform.position.x, transform.position.y - 0.5f),
new Vector2(0.9f, 0.2f), 0f, groundLayer);
return hit;
}
}
接地判定をOverlapBoxに変更していますが、下記と同じような感じです。
実行すると下記の様な感じに、左右キーで移動、スペースキーでジャンプします。

ためてジャンプする
スクリプトを下記に変更。力をためているのが分かりやすいように、スペースキーを押している間は赤くしています。
using UnityEngine;
public class jump : MonoBehaviour
{
[SerializeField] private LayerMask groundLayer;
private float PlayerSpeed = 5.0f;
private float JumpPower = 0f;
private Rigidbody2D _rb;
private SpriteRenderer _sr;
private void Start()
{
_rb = GetComponent<Rigidbody2D>();
_sr = GetComponent<SpriteRenderer>();
}
private void Update()
{
float InputX = Input.GetAxisRaw("Horizontal");
if (JumpPower == 0.0f && isGrounded())
{
_rb.velocity = new Vector2(InputX * PlayerSpeed, _rb.velocity.y);
}
if (Input.GetKey("space") && isGrounded())
{
_sr.color = Color.red;
if (JumpPower < 30.0f)
JumpPower += 0.1f;
}
if (Input.GetKeyUp("space"))
{
if (isGrounded())
{
_rb.velocity = new Vector2(InputX * PlayerSpeed, JumpPower);
JumpPower = 0.0f;
_sr.color = Color.white;
}
}
}
private bool isGrounded()
{
Collider2D hit = Physics2D.OverlapBox(
new Vector2(transform.position.x, transform.position.y - 0.5f),
new Vector2(0.9f, 0.2f), 0f, groundLayer);
return hit;
}
}
実行すると下記の様な感じに。

