このブログは「ファイブボックス一分間Unity講座」の補足説明となる記事です。主にUnityに初めて触れる方や初心者向けの講座になります。
またUnityに慣れてきている方でも、もう少し知識や技術を磨きたい方にとっても有益な情報も記載していますので、もしよろしければご参照ください。
前回の記事では3Dオブジェクトに Rigidbodyを使って基本的なジャンプをさせる方法を説明しました。今回は課題になっていた空中でのジャンプの制御について説明していきます。
一分間Unity講座 3Dオブジェクトのジャンプ Step2 のショート動画です。ご興味がございましたら、こちらの動画もご参照ください!
空中ジャンプの制御
空中でのジャンプを制御するには、地面に触れているのか離れているのかを判定するフラグ、または何回目のジャンプなのかを数える変数があると便利です。
空中ジャンプを不可にする
上で作成したジャンプは空中でジャンプすることができてしまいます。
まずは空中ジャンプをなくすプログラムを作成します。
ハイライト部分のコードが修正部分です。
bool isGround = false; //地面接地フラグを宣言
void Update()
{
//上矢印キーが押されたとき かつ isGround が true の時
if (Input.GetKeyDown(KeyCode.UpArrow) && isGround )
{
//Rigidbodyに上方向にJumpPowerの力を加え
rb.AddForce(transform.up * jumpPower);
}
}
//当たり判定
void OnCollisionEnter(Collision collision)
{
//当たった相手の名前が「Plane」なら
if (collision.gameObject.name == "Plane")
{
isGround = true; //isGround を true に
}
}
//脱出判定
void OnCollisionExit(Collision collision)
{
//脱出した相手の名前が「Plane」なら
if (collision.gameObject.name == "Plane")
{
// isGround = false; //isGround を false に
}
}
当たり判定系のイベント関数は次の3つが用意されています。
- OnCollisionEnter(Collision collision) Collitionを持った相手に当たった時発動
- OnCollisionStay(Collision collision) Collitionを持った相手に当たっている間発動
- OnCollisionExit(Collision collision) Collitionを持った相手から離れたときは発動
引数:collition
は Collition型、つまり当たった相手の当たり判定になります。この collitionを使って当たった相手の情報を取得することができます。
使用例:
collition.gameObject.name : 当たった相手の名前
collition.transform.position : 当たった相手の座標
collition.gameObject.GetComponent<Rigidbody>() : 当たった相手からRIgidbodyコンポーネントを取得
今回は当たった相手の名前が “Plane”(地面)なら、つまり地面に着地したら、変数 : isGround
を true
にして、再度再度ジャンプができるようにしています。
また、離れた相手の名前が “Plane”(地面)なら、つまりジャンプで地面から離れたら、変数 : isGround
を false
にしてジャンプができないようにしています。
空中ジャンプ1回可
1回だけ空中でジャンプができるように指定します。
今度は、整数型(int型)の 変数:jumpCount
を宣言しました。初期値に 0 を入れました。ジャンプができる条件を かつ条件で jumpCount が1以下とします。jumpCount <= 1
作成済みのコードを次のように修正します。
int jumpCount = 0; //ジャンプの回数をカウントする変数を宣言
void Update()
{
//上矢印キーが押されたとき かつ jumpCpunt が 0以下のとき
if (Input.GetKeyDown(KeyCode.UpArrow) && jumpCount <= 1 )
{
//Rigidbodyに上方向にJumpPowerの力を加え
rb.AddForce(transform.up * jumpPower);
jumpCount++; //jumpCount をインクリメント
}
}
//当たり判定
void OnCollisionEnter(Collision collision)
{
//当たった相手の名前が「Plane」なら
if (collision.gameObject.name == "Plane")
{
jumpCount = 0; //jumpCount を 0 に指定
}
}
//脱出判定
void OnCollisionExit(Collision collision)
{
//脱出した相手の名前が「Plane」なら
if (collision.gameObject.name == "Plane")
{
// isGround = false; //コメントアウト
}
}
さらに、ジャンプのタイミングで jumpCount
をインクリメント(1ずつ増やす)しています。
地面に触れたとき jumpCount
をリセット(0に戻す)しています。これで空中で1回だけジャンプができるようになりました。
この基本を押さえれば、空中で2回まで、3回までのジャンプなど、応用が出来そうですね。