Unityで2Dシューティングをおためし作成していて、当たり判定の考え方がよくわからなかったのでまとめおくことにします。Unityは点で作成するといよりもすべてがつながっている感じなので当たり判定の部分だけ書いてもわかりづらい可能性はあります。
Unity2Dの当たり判定で重要なこと
Unity2Dの当たり判定で重要な点をいくつか書いていきたいと思います。
- 衝突する2つのオブジェクトにcolliderを追加する(inspectorのadd componentから追加する)
- どちらか一方のオブジェクトにはrigidbody2Dを追加しておく(inspectorのadd componentから追加する)
- 受け側のis Triggerにチェックをいれておく
collideは日本語にすると「衝突する」という意味になります。colliderは衝突していくほうされるほうどちらにもcomponentを追加しておきます。rigidbody2Dはどちらか一方に必ずcomponentを追加しておきます。やってみればわかるのですがrigidbody2Dがないと衝突判定がされません。
当たり判定に関係するコード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BulletScript : MonoBehaviour { public GameObject explosionPrefab; // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.Translate(0, 0.2f, 0); if(transform.position.y > 5){ Destroy(gameObject); } } void OnTriggerEnter2D(Collider2D coll) { Instantiate (explosionPrefab, transform.position, Quaternion.identity); Destroy (coll.gameObject); Destroy (gameObject); } }
コードの解説
衝突に関係するコードは21行目は25行目です。衝突の判定はOnTriggerEnter2Dで行います。OnTriggerEnter2Dは公式によると以下のような役割があるようです。
この文章はぱっとみてピンとこないのですが「トリガーの中に別のオブジェクトが入ったときに呼び出されます。」という文章に注目します。このことから、is Triggerのチェックは受け側で行う必要があるということです。
つくっているゲームが弾をうって岩に当たったら消えるという表現をしたい場合は岩のほうにis Triggerをチェックをいいれるということになります。
OnTriggerEnter2Dメソッドの引数collはなにが入っているかというと、公式では「入ったオブジェクトに関する情報」と表現されています。←これははっきりいってめちゃくちゃわかりにくいです。このゲームでいうと受け側(岩)になります。Destroy(coll.gameObject);で岩を消しているということになります。
Unity2Dの当たり判定まとめ
Unity2Dの当たり判定は結構わかりにくい上に当たり判定と当たったときの処理はプログラムで実装する必要があるので結構難しいです。ですが、最初に書いたポイントをおさえるのと、コードの意味を少し理解できれば、「弾にあったたら消す」くらいの実装は理解できるはずです。Unityがはじめてでなにがなんだかさっぱりだという方はdotinstallでunityレッスンが無料でうけられるのでそちらを受けるのがよいです。というか筆者もさっぱりです。
コメント