侵入検出(当たり判定)をRaycastとColliderで実装【Unityメモ】

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;
    }
}

実行すると下記のような感じです。

検知範囲が分かりやすいようにコライダーの形に合わせてライトを設置してあります。

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