Unityで侵入検出(当たり判定)を実装してみます。
今回は「Physics2D.Raycast」を利用した場合と「ColliderのTrigger」を利用した場合の2パターンで実装してみます。
はじめに
Unityのバージョンは2021.3.14f1で作成しています。下記のような感じで、指定場所を通過したのを検出していきます。
真下を通過したら色を変更しています。
実装開始
まずはRaycastで実装していきます。
オブジェクトの追加
「2DObject」→「Sprites」→「Square」を2つ追加。名前を「Player」と「Ground」にします。
PlayerにAddComponentから「Rigidbody2D」と「BoxCollider2D」をアタッチ。
Groundには「BoxCollider2D」をアタッチ。SpriteRendererの色を変更しておきます。位置とサイズも変更します。
ゲーム画面が下記のような感じですね。緑色が地面で、白四角が動かすプレイヤーです。
プレイヤーを左右に動かすので下記スクリプトを作成してPlayerにアタッチします。
using UnityEngine; public class Player : MonoBehaviour { private float _Speed = 5.0f; private Rigidbody2D _rb; private void Awake() { _rb = GetComponent<Rigidbody2D>(); } void Update() { float inputX = Input.GetAxisRaw("Horizontal"); _rb.velocity = new Vector2(inputX * _Speed, 0); } }
検知するオブジェクトの追加
「2DObject」→「Sprites」→「Circle」を追加します。
下記スクリプトを作成してアタッチします。
using UnityEngine; public class Detection : MonoBehaviour { private float _length = 3.0f; private SpriteRenderer _Renderer; private void Awake() { _Renderer = GetComponent<SpriteRenderer>(); } void Update() { RaycastHit2D raycastHit = Physics2D.Raycast(transform.position, Vector2.down, _length); if (raycastHit) _Renderer.color = Color.red; else _Renderer.color = Color.white; } void OnDrawGizmos() { Gizmos.color = Color.green; Gizmos.DrawRay(transform.position, new Vector3(0, -_length, 0)); } }
下向きに光線を出していて、そこに触れたら色を変えています。OnDrawGizmosは分かりやすいようにシーン画面にレイを表示しています。
プレイヤーを左右に動かしてレイに触れると色が変わります。
コライダーのトリガー
次にColliderのTriggerを利用して実装してみます。
「PolygonCollider2D」をアタッチし、「IsTrigger」にチェックを入れます。Pointsは好きな形で指定できます。下記では斜めの三角形になるように指定しています。
スクリプトを下記に変更します。コライダー内にいる時は色を変更しています。
using UnityEngine; public class Detection : MonoBehaviour { private SpriteRenderer _Renderer; private void Awake() { _Renderer = GetComponent<SpriteRenderer>(); } private void OnTriggerStay2D(Collider2D collision) { _Renderer.color = Color.red; } private void OnTriggerExit2D(Collider2D collision) { _Renderer.color = Color.white; } }
実行すると下記のような感じです。
検知範囲が分かりやすいようにコライダーの形に合わせてライトを設置してあります。