【Unity2D】画面外に落下した物体を削除する

前回の記事で物体が重力に従って落下していきました。
しかし、画面外に出ても永遠に落ち続けていきますので、オブジェクトとしてはいつまでも残ってしまうことになります。
ある程度落ちたところで物体を削除したいと思います。

方法としては画面外に落ちていく物体を補足するための別のコライダーを設置してみようと思います。
今回はエディターの操作だけではなく、スクリプトによる操作も必要になっていきます。

まず、以下の状態から始めます。
円と四角のスプライトをシーンに配置し、それぞれにRigidbody2Dとコライダーを設定します。
円にはサークルコライダー、四角にはボックスコライダーが設定されています。
四角のRigidbody2Dはボディタイプを静的に設定しているので、円が落下すると四角に当たって止まります。

画面外に補足用のコライダーを設置する

四角のスプライトを画面外の下方に移動します。
サイズを変更して横一杯に拡げます。
C6F8C0E1-21A8-448A-AC6B-9A814CB5AFD3.png
このままで当たり判定を行っても良いのですが、余計な衝突処理が行われますので、四角のスプライトのコライダーをトリガーとして設定します。
「Box Collider2D」の「トリガーにする」にチェックを入れます。
6BA51B28-969F-43D2-95DD-DE2E248AB88B.png
この状態で実行すると、円は画面外の四角を素通りして落ち続けていきます。
円が四角に接触した時に、円を削除する処理を加えていきます。

トリガーについて

トリガーとして設定すると衝突処理が行われずに円のスプライトは通過していきます。
しかし、接触したり通過中であるという状態を検知することができます。

物体としては衝突させたくないが、例えばキャラクターがある位置にきたことを検知したいときなどにトリガーを使うことができます。

物体と補足用のコライダーとの当たり判定を行う

接触した最初の時点でOnTriggerEnter2Dメソッドが呼ばれますので、このメソッド内でオブジェクトの削除処理を行います。

プロジェクトのAssetsで右クリックし、「作成」->「C#スクリプト」とクリックします。
B33CD884-84F3-46F6-8476-3B7ADB63FA43.png
C#スクリプトが作成されるので、名前をつけてください。ここでは「Box」と名前をつけました。
DECB3B6C-5E74-42F4-9CC2-272C361FA40A.png
このC#スクリプトをヒエラルキーの四角のスプライトにドラッグ&ドロップします。
スクリプトがコンポーネントとして追加されました。
5281D17A-99E9-473D-86D3-05852821662F.png
C#スクリプトをダブルクリックします。VisualStudioが起動し、スクリプトを編集できるようになります。
オブジェクトを削除するにはDestroyメソッドを使用します。
Destroyメソッドを使って接触した物体を削除していきます。
ここでは以下のように記述しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Box : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        Destroy(collision.gameObject);
    }
}

実行ボタンを押してゲームを起動しますが、画面外の状態を把握することができません。
シーンタブとゲームタブを並べて状態を見てみます。

円が四角に接触した時点で削除されています。
これで画面外に落ちていった物体を削除することができました。