Unity入門#1の記事でも使用した
地面を検知した時だけ、
ジャンプができるようにする方法について、解説します。
”地面を検知した時だけ”という条件を実装しなければ、
空中ジャンプができてしまい、舞空術ありアクションゲームと化してしまいます^^;
なので、正常なアクションゲームを作りたい場合、
この条件設定は必須と言ってよいでしょう。
まずは、それを実装するためのコードです。
bool isGrounded; void Update() { isGrounded = CheckGround(); if (Input.GetKeyDown(KeyCode.Space)) { if(isGrounded) { isGrounded = false; rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse); } } } bool CheckGround() { var ray = new Ray(transform.position + Vector3.up * 0.01f, Vector3.down); var distance = 1.5f; return Physics.Raycast(ray, distance); }
Update関数にジャンプのコードを書くことで、
ジャンプのためのSpaceキー入力をいつでも検出して、処理するようになっています。
その直前に、必ずCheckGround()という関数が
「isGround 」=となっています。
これは、CheckGroundという関数で返された値(戻り値)をisGroundedに代入するということです。
isGroundedの種別はboolであり、trueまたはfalseをとる変数です。
そして、もちろんCheckGround関数もbool CheckGroundとし、
trueかfalseを返す関数とします。
Spaceキーを押しても、CheckGroundがtrueでなければ、
そのif文の中身が読まれないので、空中ではジャンプができないようになるのです。
ちなみに、boolの値でif文を作る場合、
if(isGrounded) は、if(isGrouded == true)と同意で
if(!isGrounded) は、if(isGrounded == false)と同意となります。
それでは気になる、肝心のCheckGround関数を見てみましょう。
Rayは光線です。
2Dの画面スワイプゲームの作り方でも出てきましたね^^
var rayを宣言し、まず基本的な定義を行います。
開始地点として、オブジェクトの0.01f真上の地点に、
光線を飛ばす方向を、Vector3.down、つまり真下方向にしています。
さらに、var distanceを宣言し、光線を飛ばしたときに、衝突を検出する範囲(距離)1.5fと定義してます。
returnの後には、何の結果(bool)を返すかを記述するのですが、
ここで初めて、光線の衝突を判定するPhysics.Raycastを用います。
宣言してきたrayとdistanceを引数に入れて、判定させます。
オブジェクトの真下方向に、距離1.5fの範囲で、
衝突するものがあるかどうか、trueまたはfalseで判定します。
このようにisGroundedにその結果を返す仕組みです。
なお、CheckGrounded関数の戻り値が代入されるまで、
次のコードが読み進まれないことも理解しておきましょう。
以上、地面の上にいるときのジャンプとその仕組みの説明でした!!