Unity 2Dでキャラクターをジャンプさせる方法!

Unity 2DでキャラクターをジャンプさせるUnity

Unity 2Dでキャラクターをジャンプさせる方法について、サンプルコードと一緒に解説を書いています。

今回はイルカが海でジャンプしているようなサンプルを作成しました😃
クリックした時(スマホの場合はタップ)にキャラクターがジャンプするようにしてみました。

ジャンプのサンプルコードはパソコンとAndroidで動くことを確認しています。
Githubのこちらで、今回のプロジェクトを公開しています。
GitHub - YasuakiHirano/PocUnity2D
Contribute to YasuakiHirano/PocUnity2D development by creating an account on GitHub.

検証に使用しているUnityのバージョンは’2021.1.19f’です。

Unity 2Dでキャラクターをジャンプさせるには?

キャラクターにRigidbody 2Dと、Box Collider 2Dコンポーネントを追加してあげます。
Rigidboyに対して、上の方に力を加えることで、キャラクターをジャンプさせます。

こんな感じになります。

Unity 2Dでジャンプするシーン構成

実際にジャンプするためのシーンの構成についてです。

キャラクターと床を配置します。
イルカのキャラクターと、Spriteを使用して、見えない床を配置しています。
Unity 2Dでジャンプする - キャラクター配置

キャラクターに対して、Rigidbody 2Dと、Box Collider 2Dコンポーネントを追加しています。(プロパティ値はデフォルトです)
また、PlayerJumpControllerという名前でスクリプトを追加しています。
Unity 2Dでジャンプする - キャラクターにコンポーネントなどを追加

床にもBox Collider 2Dコンポーネントを追加しました。その後に、床オブジェクトのタグを”Floor”に設定しました。
タグはキャラクターと床がColliderで、ぶつかった場合の判定で使用します。
Unity 2Dでジャンプする - 床オブジェクトの設定

コンポーネントの追加に関しては前回のこちらの記事を見ていただくと良いです。

Unity 2Dでジャンプするサンプルスクリプト

実際にジャンプさせるためのスクリプトを下記のように作成しました。
イルカのキャラクターに関連付けているスクリプトになります。冒頭に載せたGithubでも確認可能です。

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

public class PlayerJumpController : MonoBehaviour
{
    private Rigidbody2D rbody2D;

    private float jumpForce = 350f;

    private int jumpCount = 0;

    void Start()
    {
        rbody2D = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0) && this.jumpCount < 1)
        {
            this.rbody2D.AddForce(transform.up * jumpForce);
            jumpCount++;
        }
    }

    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("Floor"))
        {
            jumpCount = 0;
        }
    }
}

解説

スクリプトについて解説します。

まず、アプリを開始した一回のみ処理するStartメソッドについてです。
キャラクターに紐づいているRigidbody2dコンポーネントを取得して、rbody2Dに変数に格納しています。

次にUpdateメソッドです。
実行中、毎回走るメソッドです。入力内容などはここで処理します。

Input.GetMouseButtonDown(0)はマウスを押したときや、画面をタップした場合にtrueになります。
this.jumpCountはクラスに持っているグローバルな変数を参照しています。初期値は0です。

つまり、下記のif文はマウスを押した(タップした)場合かつjumpCountが0の時だけ、処理をしています。

if (Input.GetMouseButtonDown(0) && this.jumpCount < 1)
{
    this.rbody2D.AddForce(transform.up * jumpForce);
    jumpCount++;
}

if文の中では、Startメソッドで取得したrbody2Dに対して、AddForceしています。
スクリプトが紐づけられたオブジェクトに対して、力を加えているということです。

transform.upで上方向に対して、jumpForceの力を加えます。
jumpForceは350を設定しています。設定値が多いほどジャンプ力が高くなります。

ジャンプさせた後はjumpCountをプラス1しています。
これでジャンプが1回しかできなくなります。(this.jumpCount < 1の条件を満たさないため)

このjumpCountを入れない場合は、ずっとジャンプできる状態になってしまいます。。

1回しかジャンプできないとゲームにならないので、0回に戻す処理が必要です。
それを床に着地したときに行っています。

private void OnCollisionEnter2D(Collision2D other)
{
    if (other.gameObject.CompareTag("Floor"))
    {
        jumpCount = 0;
    }
}

OnCollisionEnter2DはColliderオブジェクト同士が当たった場合に呼ばれます。
other.gameObjectで当たったオブジェクトの情報が取得できます。

if文で当たったオブジェクトのタグを比較しています。
タグ(“Floor”)を設定した床に当たった場合に、こちらの処理が行われて、jumpCountが0にリセットされます。

2段ジャンプしたい場合

上記の解説を見て気づいたかもしれません。
jumpCountを変えることによって、ジャンプの回数を増やすことが可能です。

下記のように設定することによって、2段ジャンプが実現できます。

if (Input.GetMouseButtonDown(0) && this.jumpCount < 2)
{
    this.rbody2D.AddForce(transform.up * jumpForce);
    jumpCount++;
}

回数を変数に持てば、3段、4段など動的に変更もできそうですね。

終わりに

今回はUnity 2Dでキャラクターをジャンプさせる方法を見ていきました。

要点をまとめると…
Rigitbody 2Dをつけたキャラクターに対して、上に力を加えることでジャンプが可能でした。

そのままだと、ずっとジャンプできてしまうので、ジャンプ回数を制限するためにjumpCountを使用しました。
jumpCountが0の場合は、ジャンプして、jumpCountを増やしました。
床に着地した際にOnCollisionEnter2DメソッドでjumpCountを0に戻しました。

いかがだったでしょうか。意外と簡単にジャンプさせることが可能ですね。

コメント

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