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

【Unity】プレイヤー作成

プレイヤーの接地判定を作る

 今回はプレイヤーの接地判定を作っていきます。
プレイヤー編の前回の記事はこちら⇨【Unity】マリオのような2Dゲームを作る〜プレイヤー編③〜

プレイヤーに接地判定を作るために

 ジャンプする際に地面についているときにだけジャンプをさせたいので、地面についているかどうかの判定が必要になります。普通に作ると無限にジャンプができてしますので・・・。

接地判定用にオブジェクトを作る

 プレイヤーを選択した状態で右クリックをし、Create Emptyで空のゲームオブジェクトを作ります。接地判定用のゲームオブジェクトですので、ここでは名前を分かりやすくCheck Groundとします。
名前は自分が分かりやすい名前にしましょう。

ゲームオブジェクトにBoxCollider2Dを付与する

 接地判定にはColliderで検知するため、Boxcollider2Dにて判定を得る。
Boxcolliderを加える方法はAdd Compornent⇨Boxcollider2Dで加えることができます。
【Unity】マリオのような2Dゲームを作る〜プレイヤー編①〜ではCirclecolliderを使っていますが方法としては同じなのでAdd Conpornentの方法がわからない場合はこちらを参照してください。

 BoxColliderを加えたらColliderの幅をプレイヤーに合わせ、高さを低めに作ります。
次にis Triggerに☑️を入れて完了です。
このis Triggerにチェックを入れることで、当たり判定がなくなりますが判定内に入ったものを取得することができます。

スクリプトに必要なタグをつくる

 接地判定のスクリプトに必要なタグというもの作ります。作り方は⏬の動画を参考にしてください。

接地判定のスクリプトを作成する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CheckGround : MonoBehaviour
{

private string groundTag = "Ground";
private bool isGround = false;
private bool isGroundEnter, isGroundStay, isGroundExit;

public bool IsGround()
{
    if (isGroundEnter || isGroundStay)
    {
        isGround = true;
    }
    else if (isGroundExit)
    {
        isGround = false;
    }

    isGroundEnter = false;
    isGroundStay = false;
    isGroundExit = false;
    return isGround;
}

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.tag == groundTag)
    {
        isGroundEnter = true;
    }
}

private void OnTriggerStay2D(Collider2D collision)
{
    if (collision.tag == groundTag)
    {
        isGroundStay = true;
    }
}

private void OnTriggerExit2D(Collider2D collision)
{
    if (collision.tag == groundTag)
    {
        isGroundExit = true;
    }
}

}

※必ずマーカーで引いた名前とタグの名前を合わせるようにしてください。でないとエラーが起こります!!

プレイヤーが接地判定を読められるようにする

 接地判定を作ってもプレイヤーが読めなければ意味がないのでプレイヤーのスクリプトに少し書き足して、
先ほど作った接地判定のスクリプトをプレイヤーが読むことができるようにします。
//newと書かれた箇所が前回より書き足された箇所になります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
     public float speed;
     public CheckGround ground; //new

     private Animator anim = null;
     private Rigidbody2D rb = null;
     private bool isGround = false; //new

     void Start()
     {
          anim = GetComponent<Animator>();
          rb = GetComponent<Rigidbody2D>();
     }

     void Update()
     {
          isGround = ground.IsGround(); //new

          float horizontalKey = Input.GetAxis("Horizontal");
          float xSpeed = 0.0f;
          if (horizontalKey > 0)
          {
              transform.localScale = new Vector3(1, 1, 1);
              anim.SetBool("run", true);
              xSpeed = speed;
          }
          else if (horizontalKey < 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, rb.velocity.y);
      }
 }

※マーカーで引いた部分と接地判定で作ったゲームオブジェクト(ここではCheckGround)の名前は必ず合わせましょう!!

最後に

 プレイヤーを選択するとインスペクターにGroundの欄が追加されたと思います。こちらにCheckGroundの、
ゲームオブジェクトをドラッグ&ドロップ
で貼り付けて完成です!!これでプレイヤーは接地判定を読むことができるようになりました。
次回はジャンプアクションを作ります!!
次の記事はこちら⇨【Unity】マリオのような2Dゲームを作る〜ジャンプアクション編〜

コメント

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