【Unity2D】2Dキャラクターにジャンプを実装しよう!

Unity

前回はキャラクターを動かせるようにしました。

そのキャラクターにジャンプを追加していきましょう。

前回の記事↓

準備

ジャンプには地面との接地を取得しなければなりません。

その接地を取得する位置はプレイヤーの足元なので、そこに空のオブジェクトを配置します。

次に、地面が地面として認識されるようにするためにレイヤーを設定します。

準備は以上です。

それではスクリプトを書いていきましょう。

スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerJump : MonoBehaviour
{
    [SerializeField] GameObject groundCheckPos;
    [SerializeField] float fallMultiplier; //落ちるときの速度の乗数
    [SerializeField] float jumpMultiplier; //ジャンプして上がるときの速度の乗数
    [SerializeField] float jumpForce; //ジャンプの力
    [SerializeField] float jumpTime; //ジャンプしていられる時間
    [SerializeField] float checkRadius; //地面接地の取得範囲
    public LayerMask Ground;

    Vector2 vecGavity;
    Rigidbody2D rb;

    float jumpCounter;

    bool isJumping;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        vecGavity =new Vector2(0, -Physics2D.gravity.y);
    }

    void Update()
    {

        JumpHandler();

        //キャラクターの落ちる速度を徐々に増加させる
        if (rb.velocity.y < 0)
        {
            rb.velocity -= vecGavity * fallMultiplier * Time.deltaTime;
        }

        //ボタンを押した時間によってジャンプの高さが変わるようにする
        if (rb.velocity.y > 0 && isJumping)
        {
            jumpCounter += Time.deltaTime;

            if (jumpCounter > jumpTime)
            {
                isJumping = false;
            }

            float t = jumpCounter / jumpTime;
            float currentJumpM = jumpMultiplier;

            //ジャンプの半分に達したら徐々に上がる速度を落とす
            if (t > 0.5)
            {
                currentJumpM = jumpMultiplier * (1 - t);
            }

            rb.velocity += vecGavity * currentJumpM * Time.deltaTime;
        }

    }

    //ジャンプ関数
    private void JumpHandler()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (isGrounded())
            {

                isJumping = true;

                jumpCounter = 0;

                Jump();
            }
        }

        if (Input.GetKeyUp(KeyCode.Space))
        {
            isJumping = false;
        }
    }

    private void Jump()
    {
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);
    }

    //地面との接地をチェック1
    private bool isGrounded()
    {
        return Physics2D.OverlapCircle(groundCheckPos.transform.position, checkRadius, Ground);
    }
}

このスクリプトをプレイヤーにアタッチしましょう。

アタッチしたらいろんな項目があるのでちょうどいいと思うくらいの値に変更します。

Ground Check pos: 準備のときに用意した空のオブジェクトを入れましょう。

Fall Multiplier:落ちるときの速度を上げる乗数

Jump Multiplier:ジャンプ時の上昇力を上げる乗数

Jump Force:ジャンプ力

Jump Time:ジャンプ後の上昇し続ける時間

Check Radius:地面接地の取得範囲

Ground:ここは、Groundレイヤーだけにチェックしてください

それでは、実行してみましょう。

ジャンプができるようになりました!

しかし、宇宙空間にいるようなふわふわした感じになっていますね。

これを直すには、プレイヤーのRigidBody2Dの「GravityScale」で重力を増やせばよくなります。

重力を増やした分ジャンプ力も増やさないとプレイヤーのジャンプが低くなるので「JumpForce」も増やしておきましょう。

これで実行をすると、

ジャンプの完成です!

まとめ

いかがだったでしょうか?

ダブルジャンプの作り方もいつか書こうと思います。

ダブルジャンプの記事↓

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