CGBoxの一部の記事にはアフィリエイト広告が含まれております。
【Unity】Rigidbodyでジャンプを実装する方法
こんにちは!Unityでアクションゲームを作るためには、ジャンプは必須ですよね。
Unityにはジャンプさせる方法がいくつかありますが、Rigidbodyを使う方法が一般的です。
本記事では、Rigidbodyでジャンプを実装する方法を中心に解説していきます!
2D・3Dでジャンプを実装する方法
以下のような順番で、ジャンプを実装する方法を解説していきます。
- AddForceでジャンプするスクリプトを作る(2D・3D別)
- ジャンプがおかしいとき
- ジャンプ中の移動を制限する
- Rigidbodyを使わずにジャンプさせる方法
AddForceを使えば下のような挙動のジャンプが実装できます。
AddForceでジャンプするスクリプトを作る
AddForceとは?
AddForceとはRigidbodyクラスに用意された関数の一つです。
物体に瞬間的に力を加えて速度を与えるイメージです。
物理演算を利用したジャンプのさせ方であり、リアルな挙動を実現することができます。
AddForceを使ってジャンプを実装する手順は以下の通りです。
- プレーヤーと床を配置
- プレーヤーと床にColliderとRigidbodyを設定
- プレーヤーにキーを押すとAddForceするスクリプトをアタッチ
2D
ここでは2Dのワールドでジャンプを実装する方法を解説します。
まずは下のようにプレーヤーと床を、それぞれ2DオブジェクトのCapsule、Squareを用いて作成します。
次にプレーヤーにRigidbody2DとCapsule Collider2Dを設定します。
下のように、プレーヤーのインスペクター内Add ComponentからRigidbody2D、Capsule Collider2Dを選択しましょう。
同様にして床にはRigidbody2DとBoxCollider2Dを設定します。
床の位置は固定したいため、Rigidbody2D内のFreezePositionのX,Yにチェックを入れておきましょう。
次にジャンプするスクリプトを作成します。
下のようなJumpTestスクリプトを作成しましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JumpTest : MonoBehaviour
{
float jumpForce = 200f;
Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
this.rb.AddForce(transform.up * this.jumpForce);
}
}
}
作成したスクリプトをプレーヤーオブジェクトにドラッグアンドドロップします。
これでジャンプを実装する手順は完了です。
プログラムを実行し、スペースキーを押して動作を確認してみましょう。
このようにジャンプを実装することができました。
3D
続いて、3Dのワールドでジャンプを実装する方法を解説します。
まずは下のようにプレーヤーと床を、それぞれ3DオブジェクトのCapsuleとPlaneを使って作成します。
続いて下のように、プレーヤーのインスペクター内AddComponentからRigidbodyを設定しましょう。
3Dの場合オブジェクトを作成した時点でColliderも追加されているため、追加するのはRigidbodyだけです。
次に下のようなJumpTestスクリプトを作成しましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JumpTest : MonoBehaviour
{
float jumpForce = 4f;
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
rb.velocity = Vector3.up * jumpForce;
}
}
}
作成したスクリプトをプレーヤーオブジェクトにドラッグ&ドロップします。
これでジャンプを実装できました。
プログラムを実行して動作を確認してみると、下のようにスペースキーを押す度にジャンプするようになりました。
ジャンプがおかしいとき
ジャンプが実装できましたが、ジャンプするスペースボタンを連打すると下のようにおかしい挙動をすると思います。
これは2D、3Dともに今の状態だと常にジャンプできる状態(いわゆる2段ジャンプ)が可能になっています。
地面に足がついている状態でのみジャンプできるようにするためには、「接地判定」を実装する必要があります。
接地判定の実装については下の記事が参考になります。
ジャンプ中の移動を制限する
ジャンプ中には横方向の移動を制限したい場合があるかと思います。
そんな時は接地判定を利用し、地面に足が着いている状態でのみ移動入力を受け付けるようにすれば実装できます。
キャラクターを移動させるスクリプトについては、下の記事で解説しています。
Rigidbodyを使わずにジャンプさせる方法
ここまでRigidbodyクラス内の関数である、AddForceを使ってジャンプさせる方法を解説してきました。
他にもジャンプを実装する方法を2つ紹介します。
CharacterControllerを利用する
Unityではキャラクターを動かす方法として、CharacterController関数が用意されています。
このCharacterControllerを使えばRigidbodyを使わずにジャンプを実装することができます。
具体的な実装方法やスクリプトについては下の記事が参考になります。
transform.positionの値を直接指定する
物理的な計算をせずにキャラクターの座標を直接指定して動かすことで、ジャンプさせる方法もあります。
Update関数内で、毎フレームごとに少しずつtransform.positionの値を書き換えることで実装できます。
ただし重力による影響などは自分で計算する必要があるため、リアルな挙動のジャンプを実装するのには向きません。
ジャンプ台を作る方法
ジャンプ台は、以下の手順で実装できます。
- プレーヤーキャラクターに「Player」タグを追加
- Playerタグとの衝突を検知するとプレーヤーに上向きに力を加えるスクリプトを作る
- ジャンプ台オブジェクトにスクリプトをアタッチ
- ジャンプ台のColliderのIs Triggerにチェック
具体的なスクリプトと実装方法については下の記事が参考になります。
おすすめアセット
2Dアクションゲーム作りに便利なアセット
こちらのCorgi Engineは、2D、2.5Dのキャラクターのあらゆる動作をすぐに実装できるアセットです。
ジャンプについても充実しており、接地判定はもちろん、2段ジャンプや壁ジャンプなどを簡単な設定で実装できます。
気軽にアクションゲームを作成したい方にオススメのアセットです。
ジャンプするアニメーションのアセット
こちらのRunner Action Animation Packは、異なるアクションのアニメーションが300種類以上入ったアセットです。
走りながらアクションを行うアニメーションが充実しており、ジャンプのアニメーションも多く含まれています。
スピード感のあるアクションゲームに使いたいアセットです。
まとめ
以上、Rigidbodyでジャンプを実装する方法について解説してきました!
ジャンプの出来が良いと、操作感が良くなりゲームのクオリティがあがります。
ジャンプの実装方法については極めておきたいところですね!