はじめに
どうも、バッテラです。
前回キャラクターをジャンプさせるという記事を書きました。
https://www.m2game.net/entry/2022/09/1 4/062839www.m2game.net
しかしジャンプはできたのですが、このようにジャンプ中にジャンプができてしまう問題が起きてしまいました。
まぁ制御していないので当たり前なんですけどねー。
ということでジャンプをしたら地面に着くまではジャンプできないような制御を実装したいと思います!
接地判定のロジック(考え方)
キャラが地面に立ってるのはRigidbodyとColliderで衝突してるからで、衝突している(接地) = ジャンプ可能
という考えのもとで衝突判定を実装していけばいいことのなります。
ということで衝突判定を実装していきます。
床にタグをつける (エディタ)
床のゲームオブジェクトにTag(タグ)をつけます。これはスクリプト側で使うためなので名称はなんでもいいです、Floor
とかにしておきます。
(追記)Layerでもいいかも。区別できればなんでもOK!
接地判定処理を実装 (スクリプト)
最初に接地状態の情報を持つ変数を1個用意しておきます。
bool isGround = false;
次は接触したかを判別するプログラムを作ります。
もしプレイヤーが何かに衝突した時はOnCollisionEnter
が呼ばれるので、タグで絞り込めば床に接地したかを判断できます。コードはこんな感じ。
void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Floor") { isGround = true; } }
次は離れたかを判別するプログラムを作ります。
プレイヤーが衝突してる状態から離れた場合はOnCollisionExit
が呼ばれます。
void OnCollisionExit(Collision collision) { if (collision.gameObject.tag == "Floor") { isGround = false; } }
あとはisGroundを見てジャンプさせるかの処理を書けば完成です。
// Spaceキー押下でジャンプするコードのサンプルです void Update() { if (isGround && Input.GetKeyDown(KeyCode.Space)) { GetComponent<Rigidbody>().AddForce(transform.up * power, ForceMode.Impulse); } }
これで実行すると連打してもこのように接地しないとジャンプできないように制御できました!
おしまい。