• WEB

初心者がUnity2Dでアクションゲームを作るチュートリアル その3 【接地判定編】

  • マイケル
    マイケル デザインちーむ
  • このエントリーをはてなブックマークに追加
初心者がUnity2Dでアクションゲームを作るチュートリアル その3 【接地判定編】

こんにちは。
前回に引き続き、Unity2Dのアニメーション制御について書きたいと思います。

今回はプレイヤーが地面に接地しているときは、歩くアニメーションで、ジャンプのときはジャンプのアニメーションみたいなのをスクリプトで書いていきたいと思います。

OverlapAreaをつかう

私、コピペコーディングしかしたくないので、UnityChanの公式サイトの「ユニティちゃん 2Dデータ」をダウンロードしてそれを参考に作っていきたいと思います。

ダウンロードしてきたスクリプトを見てみると、地面の接地判定にはOverlapAreaを使ってるみたい。

そのスクリプトのある箇所は以下です。


void FixedUpdate()
{
 Vector2 pos = transform.position;
 Vector2 groundCheck = new Vector2(pos.x, pos.y - (m_centerY * transform.localScale.y));
 Vector2 groundArea = new Vector2(m_boxcollier2D.size.x * 0.49f, 0.05f);

 m_isGround = Physics2D.OverlapArea(groundCheck + groundArea, groundCheck - groundArea, whatIsGround);
 m_animator.SetBool("isGround", m_isGround);
}

最初見たときは、Pardon?と思いましたが、。丁寧に見ていったら、なんとなく理解できました。OverlapAreaは、ひとつの角とその対角にある角の座標を決めて、その四角領域に何か物体があるかないかを判定しているようです。

スクリプトの変数を解説した画像

まず、最初ら辺のコード。


void FixedUpdate()
{
 Vector2 pos = transform.position;

FixedUpdate関数は、Update関数とほぼ同様に連続して呼ばれる関数みたいだけど、いまだによく分かっていない。

Update関数と違って一定のインターバルで呼ばれて、物理演算の場合はFixedUpdate関数を使うらしい。transform.positionは、プレイヤーの位置を取得してます。


Vector2 groundCheck = new Vector2(pos.x, pos.y - (m_centerY * transform.localScale.y));
Vector2 groundArea = new Vector2(m_boxcollier2D.size.x * 0.49f, 0.05f);

groundCheckは、OverlapAreaの中心点をチェックしてします。

m_centerYは、「ユニティちゃん 2Dデータ」の設定を見てみると定数が決まってて1.5fが入ってました。
groundAreaで、四角を形成するための中心点からの移動量みたいなのを取得してます。


 m_isGround = Physics2D.OverlapArea(groundCheck + groundArea, groundCheck - groundArea, whatIsGround);
 m_animator.SetBool("isGround", m_isGround);
}

次にPhysics2D.OverlapAreaで四角の領域に何かあたり判定あるのかないかをみています。

3つ目の引数のwhatIsGroundでは、レイヤーを絞っています。つまりここではあたり判定を地面のレイヤーのみに絞っていて、それ以外のレイヤーが四角の領域に入ってきても反応しないようにしてます。

これを参考に、今作っているゲーム用にコードを以下のように書きました。


public class Player : MonoBehaviour
{
    //OverlapAreaで絞る為のレイヤーマスクの変数
    public LayerMask whatIsGround;

    // Update is called once per frame
    void FixedUpdate()
    {
        //プレイヤー位置
        Vector2 pos = transform.position;
        //あたり判定四角領域の中心点
        Vector2 groundCheck = new Vector2(pos.x, pos.y - (GetComponent<CircleCollider2D>().radius)*1.5f);
        //あたり判定四角領域の範囲の幅
        Vector2 groundArea = new Vector2(GetComponent<CircleCollider2D>().radius * 0.49f, 0.05f);

        //あたり判定四角領域の範囲
        bool grounded = Physics2D.OverlapArea(groundCheck + groundArea, groundCheck - groundArea,whatIsGround);
        //Animatorパラメーターの設定
        GetComponent<Animator>().SetBool("Ground", grounded);
    }
}

レイヤーの設定

OverlapAreaは、引数にレイヤーを設定することで、そのレイヤーを絞ってあたり判定するようにできますので、その今度はレイヤーの設定をしていきます。レイヤーは階層構造のことでペイントソフトとかよく使われる概念です。

レイヤーとは

地面のレイヤーを設定します。

InspectorのLayerから「Add Layer…」をクリックします。

Unityの操作説明

そしたら、すでにいくつかデフォルトでレイヤー設定がされていますが、「User Layer 8」が空いているのでここに地面のレイヤー名として「Land」と入れます。これで「Land」レイヤーができました。

Unityの操作説明

次に「Land」レイヤーを割り当てます。地面のブロックのレイヤーをすべて「Land」レイヤーに変更します。

Unityの操作説明

オブジェクトでまとめている場合は、以下のダイヤログが出てきますが構わずYes, Change Childとしておきます。

Unityの操作説明

最後にPlayerのInspectorに、スクリプトで設定した変数のwhatIsGroundのパラメータが生成されていますのでここを「Land」としておきます。

Unityの操作説明

再生確認

それでは、再生ボタンを押して確認します。

完成したアニメーション

ちゃんと地面に設置した時にアニメーションが切り替わってます。
接地までがうまくできました!

では、次回で最終回です。
お楽しみに~☆

このエントリーをはてなブックマークに追加

マイケルが最近書いた記事

WRITERS POSTS もっと見る

他にもこんな記事が読まれています!

  • WEB
  • マーケティング
  • サーバー・ネットワーク
  • ライフスタイル
  • お知らせ