【Unity】マリオのような2Dゲームを作る〜頭上判定編〜

頭上判定の作成

前回はプレイヤーのジャンプアクションを作りました。
前回の記事はこちら⇨【Unity】マリオのような2Dゲームを作る〜ジャンプアクション編〜
ですが、ステージに頭をぶつけると無限にジャンプができてしまう不具合が発生した為、この記事で
改善していきます。

頭上の判定を作ろう

(1) 接地判定で作ったCheckGroundをコピー
(2) Playerの下に貼り付ける
(3) 判定部分を頭上に持ってくる

頭上判定のプログラムを追加しよう

マーカーで引いてあるところが前回より新しく追加されたプログラムです。
このプログラムを追加することでジャンプの制限時間を設けることができ、頭にステージがぶつかっても
無限にジャンプすることがなくなります。

public class PlayerController : MonoBehaviour
{
public float speed;
public float jumpSpeed;
public float gravity;
public float jumpHeight;
public float jumpLimitTime;
public CheckGround ground;
public CheckGround head;

private Animator anim = null;
private Rigidbody2D rb = null;
private bool isGround = false;
private bool isHead = false;
private bool isJump = false;
private float jumpPos = 0.0f;
private float jumpTime = 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();
    isHead = head.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;
            jumpTime = 0.0f;
        }
        else
        {
            isJump = false;
        }
    }
    else if (isJump)
    {
        bool pushUpKey = verticalKey > 0;
        bool canHeight = jumpPos + jumpHeight > transform.position.y;
        bool canTime = jumpLimitTime > jumpTime;

        if (pushUpKey && canHeight && canTime && !isHead)//書き換え
        { 
            ySpeed = jumpSpeed;
            jumpTime += Time.deltaTime;
        }
        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);
}
}

インスペクターの設定を忘れずにしよう

せっかくプログラムを変えても設定しなければ意味がないので、設定は忘れずに行いましょう。
ヒエラルキーでPlayerを選択⇨Head⇨◉をクリック⇨Check Headを選択

動作確認をしよう

ステージの下からジャンプをし、ぶつかってもジャンプできなければ成功です。
今回はここまでにし、次回はジャンプのアニメーションを作っていきます。

次の記事はこちら⇨【Unity】マリオのような2Dゲームを作る〜ジャンプアニメーション編〜

コメント

タイトルとURLをコピーしました