Unity 2Dでキャラクターをジャンプさせる方法について、サンプルコードと一緒に解説を書いています。
今回はイルカが海でジャンプしているようなサンプルを作成しました😃
クリックした時(スマホの場合はタップ)にキャラクターがジャンプするようにしてみました。
Githubのこちらで、今回のプロジェクトを公開しています。
検証に使用しているUnityのバージョンは’2021.1.19f’です。
Unity 2Dでキャラクターをジャンプさせるには?
キャラクターにRigidbody 2Dと、Box Collider 2Dコンポーネントを追加してあげます。
Rigidboyに対して、上の方に力を加えることで、キャラクターをジャンプさせます。
こんな感じになります。
Unity 2Dでジャンプするシーン構成
実際にジャンプするためのシーンの構成についてです。
キャラクターと床を配置します。
イルカのキャラクターと、Spriteを使用して、見えない床を配置しています。
キャラクターに対して、Rigidbody 2Dと、Box Collider 2Dコンポーネントを追加しています。(プロパティ値はデフォルトです)
また、PlayerJumpControllerという名前でスクリプトを追加しています。
床にもBox Collider 2Dコンポーネントを追加しました。その後に、床オブジェクトのタグを”Floor”に設定しました。
タグはキャラクターと床がColliderで、ぶつかった場合の判定で使用します。
コンポーネントの追加に関しては前回のこちらの記事を見ていただくと良いです。
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に戻しました。
いかがだったでしょうか。意外と簡単にジャンプさせることが可能ですね。
コメント
とてもわかりやすかったです!
ありがとうございます😄