衝突検出をレイヤーで切り分けて設定【Unityメモ】

Unityで衝突(コライダー)を扱うの時、衝突判定をしたいオブジェクト、したくないオブジェクトが出るかと思います。今回は、衝突判定のON/OFFをレイヤーベースで切り分けるメモです。

はじめに

Unityのバージョンは2021.3.14f1です。

今回実装するのは、下記のような「弾は壁を抜けるが、プレイヤーは壁を抜けない」みたいなものです。色々な方法がありますが、今回はLayerで切り分ける方法で実装してみます。

実装開始

オブジェクトを作成し動くようにしてから、衝突検出の設定をしていきます。

オブジェクト作成

「2D Object」→「Sprites」→「Square」を2つ追加します。それぞれの名称を「Player」と「Wall」にしておきます。

「Wall」はスケールを変更し、色を薄くして壁にします。

左の白四角がプレイヤー、真ん中の線が壁です。

プレイヤーの設定

Playerオブジェクトに「Rigidbody2D」と「BoxCollider2D」をアタッチします。GravityScale(重力)は0に。

下記スクリプトを作成してPlayerオブジェクトにアタッチします。とりあえずキー操作で動くようにしてあります。

using UnityEngine;

public class Movement : MonoBehaviour
{

    private float speed = 5.0f;
    private Rigidbody2D _rb;
    private Vector2 movement;

    private void Awake()
    {
        _rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        movement.x = Input.GetAxisRaw("Horizontal");
        movement.y = Input.GetAxisRaw("Vertical");
        _rb.velocity = movement * speed;
    }
}

Wallには「BoxCollider2D」をアタッチします。

この状態で動かしてみるとコライダーが設定してあるので、下記のようにプレイヤーは壁にぶつかります。

弾の作成

次に弾を設定していきます。「2D Object」→「Sprites」→「Circle」を追加します。

名前をballにしてサイズと色を変更。

ballに「Rigidbody2D」と「CircleCollider2D」をアタッチ。GravityScaleは0に。

下記スクリプトを作成してballにアタッチ。弾を右方向に動かすスクリプトです。

using UnityEngine;

public class ballMove : MonoBehaviour
{
    private float _force = 10.0f;
    private Rigidbody2D _rb;

    private void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
        _rb.velocity = transform.right * _force;
    }
}

スクリプトをアタッチしたら弾をプレハブ化して、ヒエラルキーから削除します。

弾を発射

次に下記スクリプトを作成、スペースキーを押すと弾を発射するスクリプトです。

using UnityEngine;

public class Shoot : MonoBehaviour
{
    [SerializeField] private GameObject _ball;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
            ShootBall();
    }

    void ShootBall()
    {
        Vector2 _ballPos = new Vector2(transform.position.x + 1, transform.position.y);
        Instantiate(_ball, _ballPos, transform.rotation);
    }
}

Playerにスクリプトをアタッチして、変数にballプレハブをセット。

この状態で動かしてみます。スペースキーを押して弾を発射すると壁にぶつかります。

Layerを設定

各オブジェクトにLayerを設定して「弾は壁を通過」、「プレイヤーは壁にぶつかる」ようにしていきます。

まずは「Add Layer…」からLayerを追加します。

追加するのは「Player」、「Wall」、「Ball」の3つ。

それぞれのオブジェクトにLayerをセットします。

次に、「Edit」→「ProjectSettings…」を選択。

Physics2Dの一番下にある「LayerCollisionMatrix」を設定します。今回「Ball」と「Wall」は衝突してほしくないので、BallとWallのクロスする場所のチェックを外します。

これで実行すると、弾は壁を抜けるようになります。詳しくは下記のドキュメントが参考になりますね。

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