こんにちは。
前回に引き続き、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…」をクリックします。
そしたら、すでにいくつかデフォルトでレイヤー設定がされていますが、「User Layer 8」が空いているのでここに地面のレイヤー名として「Land」と入れます。これで「Land」レイヤーができました。
次に「Land」レイヤーを割り当てます。地面のブロックのレイヤーをすべて「Land」レイヤーに変更します。
オブジェクトでまとめている場合は、以下のダイヤログが出てきますが構わずYes, Change Childとしておきます。
最後にPlayerのInspectorに、スクリプトで設定した変数のwhatIsGroundのパラメータが生成されていますのでここを「Land」としておきます。
再生確認
それでは、再生ボタンを押して確認します。
ちゃんと地面に設置した時にアニメーションが切り替わってます。
接地までがうまくできました!
では、次回で最終回です。
お楽しみに~☆