前回はプレイヤーのジャンプアクションに必要な接地判定を作りました。
前回の記事はこちら⇨【Unity】マリオのような2Dゲームを作る〜接地判定編〜
ジャンプアクションを作ろう
マリオといえばジャンプですよね、マリオのようにジャンプで敵を倒すことができるようにするため、
今回はジャンプアクションとアニメーションを作っていきます。
プレイヤーの重力を0にする
プレイヤーを選択し、インスペクターのGravity Scaleを0にすることで重力を0にすることができます。
この状態でプレイヤーを動かすと徐々にプレイヤーが上がっていくと思います。これでプレイヤーに重力が掛かっていないことが分かります。
しかしこのままでは無重力状態でゲームにはならないので、スクリプトで重力をコントロールし、ゲームに近づけていきます。
スクリプトで制御しよう
マーカーで引いてあるところが新しく追加したコードです!
public float speed;
public float jumpSpeed;//ジャンプ速度
public float gravity;//重力
public float jumpHeight;//ジャンプの高さ
public CheckGround ground;
private Animator anim = null;
private Rigidbody2D rb = null;
private bool isGround = false;
private bool isJump = false;
private float jumpPos = 0.0f;
// Start is called before the first frame update
void Start()
{
anim = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
isGround = ground.IsGround();
float ySpeed = -gravity;
float xSpeed = 0.0f;
float horizotalKey = Input.GetAxis("Horizontal");
float verticalKey = Input.GetAxis("Vertical");
if (isGround)
{
if (verticalKey > 0)
{
ySpeed = jumpSpeed;
jumpPos = transform.position.y;
isJump = true;
}
else
{
isJump = false;
}
}else if (isJump)
{
if (verticalKey > 0 && jumpPos + jumpHeight > transform.position.y)
{
ySpeed = jumpSpeed;
}
else
{
isJump = false;
}
}
if (horizotalKey > 0)
{
transform.localScale = new Vector3(1, 1, 1);
anim.SetBool("run", true);
xSpeed = speed;
}
else if (horizotalKey < 0)
{
transform.localScale = new Vector3(-1, 1, 1);
anim.SetBool("run", true);
xSpeed = -speed;
}
else
{
anim.SetBool("run", false);
xSpeed = 0.0f;
}
rb.velocity = new Vector2(xSpeed, ySpeed);
}
実際に動かしてみる
ジャンプができるようになったんですけど、ステージに頭がぶつかると無限にジャンプができてしまいます。
これは指定したジャンプの高さに到達していないため、到達するまではジャンプできてしまうのです。
これを改善するために次回は、頭上の判定を作り無限ジャンプを防ぎます!!
次回の記事はこちら⇨マリオのような2Dゲームを作る〜頭上判定編〜
コメント