ジャンプを実装
ジャンプは前後左右の移動とは関係ないため、別のスクリプトとして実装ができる。同じPlayerMoveでも実装できるが、「一つのスクリプト=1つの責任」の考えを従い、今回はジャンプ専用の「PlayerJump」スクリプトを作成しましょう。
このスクリプトは「Jump」という入力(プロジェクト設定→入力マネージャーを確認)が発動したら、一旦Y軸の速度を変えて、上がるようにしましょう。また、ジャンプ力をUnityで変えられるようにしましょう。
スクリプト
using UnityEngine;
// ジャンプ機能を追加するスクリプト
public class PlayerJump : MonoBehaviour
{
// ジャンプ力を設定する
[SerializeField]
private float jumpPower = 5.0f;
// 速度を変えるためのリジッドボディ
private Rigidbody rbody;
// ジャンプしろ!
private bool doJump;
void Start()
{
// コンポネント取得
rbody = GetComponent<Rigidbody>();
}
void Update()
{
// ジャンプしたか?
if (Input.GetButtonDown("Jump"))
doJump = true;
}
private void FixedUpdate()
{
// ジャンプしていなければ、なにもしない
if (!doJump)
return; // メソッド終了
// 現在の速度を取得
Vector3 v = rbody.linearVelocity;
// Yだけを上書き
v.y = jumpPower;
// 速度を設定
rbody.linearVelocity = v;
// ジャンプしたので、doJump を false に戻す
doJump = false;
}
}
これでジャンプを確認しましょう。
問題:多重ジャンプ
|
ジャンプできるようになったが、空中であってもジャンプができるので、ジャンプし続けば空に飛んでしまう!これを防ぐには、現状にジャンプできるかどうかの確認が必要。
今回は「足元の下に何もなければ(つまり空中であること)、ジャンプができない」ことがジャンプの条件にしましょう。
では、どうやって足元に地面の存在確認できるのか?これを学んだ「 |
|
では、PlayerJump を更新し、地面の時だけジャンプできるようにしましょう。まず、地面の確認メソッド:
// 現在、地面を触れている?
private bool IsOnFloor()
{
// 確認する距離。ここは適切に調整
const float CheckDistance = 0.2f;
// レイが始まる位置。現在位置からもう少し上から始まる
Vector3 origin = transform.position + Vector3.up * 0.01f;
// origin から下に向かい、決まった距離のビームを発射
// 何か当たったら「true」を返す
return Physics.Raycast(origin, Vector3.down, CheckDistance);
}
そして、Update で:
void Update()
{
// ジャンプしたか?
if (IsOnFloor() && Input.GetButtonDown("Jump"))
doJump = true;
}
問題:壁にくっつける
次の試してみてください。台に向かって、ジャンプし、壁を当たってください。引き続きに壁に力を与えると、主人公が落下せず、壁にくっつけてしまう。魔雑のため、滑らずにそこでとまってしまう。
この問題を「Physics Material」で解決ができる。主人公のコライダーが魔雑ないようにし、滑りやすくしましょう。プロジェクトフォルダーの中に新しい「Physics Material」を作成し、名前は「PlayerSlide」にする
魔雑「0」弾み「0」で、どちらにも「最低数値」を使用。 Player のコライダーに「PlayerSlide」をアサインすれば完成