(この記事の使用環境: Unity 2017.1.0f1 Personal、Windows10

Unity公式のSpace Shooterチュートリアルで作成・使用している、余計なオブジェクトを消すためのスクリプト(基本となる3種類)を紹介します。

Unityでは、シーン上に余計なオブジェクトが増え続けると処理が重くなってしまうので、不要になったオブジェクトは適切に削除する必要があります。
Space Shooterチュートリアルで作成・使用しているものは、いずれも多くの場面で使用できる汎用的なものです。
  1. DestroyByTime.cs
  2. DestroyByBoundary.cs
  3. DestroyByContact.cs

1. DestroyByTime.cs
  このスクリプトがアタッチされているオブジェクトは、生成されてから指定秒数経過後に自らをDestroyします。特に、Particleエフェクトのオブジェクト(プレハブ)にあらかじめアタッチして秒数セットしておく使い方が便利です。そのほか、銃弾などを自動的に消去する場合にも便利です。
  Destroyされるまでの時間をPublic変数で指定することができるようにしておくと、複数種類のオブジェクトに使いまわせるので便利です。(爆発エフェクトは2秒で消去、銃弾は5秒で消去、など。それぞれインスペクターで指定すればよい)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class DestroyByTime : MonoBehaviour
{
    // === 外部パラメーター(インスペクター表示)=============================

    public float lifeTime;


    // === コード(MonoBehaviour基本機能の実装)==============================

    private void Start ()
    {
        Destroy ( gameObject, lifeTime );
    }
}


2. DestroyByBoundary.cs
  このスクリプトがアタッチされているオブジェクトは、定められた境界から外れたオブジェクトをDestroyします。
  Space Shooter チュートリアルでは、プレイエリアとなる領域にCubeを配置し(描画しない透明なオブジェクト)、そのCubeにコライダー(isTrigger)とこのスクリプトをアタッチして使用しています。
  応用としては、Cubeを配置するのではなく、オブジェクトのX・Y・Z座標のいずれかが一定範囲外に出たらDestroyするなどの方法もあります(その場合はOnTriggerExitではなく、if文で処理すればよい)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class DestroyByBoundary : MonoBehaviour
{
    private void OnTriggerExit ( Collider other )
    {
        Destroy ( other.gameObject );
    }
}

3. DestroyByContact.cs
  このスクリプトがアタッチされているオブジェクトは、他のオブジェクトと衝突した際に、自らのオブジェクト(または衝突相手のオブジェクト)をDestroyします。OnTriggerEnter() または OnCollisionEnter() を使用します。
  衝突したオブジェクトの名前・タグ・レイヤー等によって処理を無視したり、Destroy以外の処理を付け加えることもできます。
  下記は一例で、Space Shooterチュートリアルで作成するスクリプトです。このように、さまざまな処理を追加して使用できます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class DestroyByContact : MonoBehaviour
{
    // === 外部パラメーター(インスペクター表示)=============================

    public GameObject explosion;
    public GameObject playerExplosion;
    public int scoreValue;


    // === キャッシュ ========================================================

    GameController gameController;


    // === コード(その他)===================================================

    private void Start ()
    {
        gameController = GameObject.FindWithTag ( "GameController" ).GetComponent<GameController> ();
    }


    private void OnTriggerEnter ( Collider other )
    {
        if ( other.CompareTag ( "Boundary") || other.CompareTag ( "Enemy") ) return;	

        if ( explosion != null ) Instantiate ( explosion, transform.position, transform.rotation );

        if ( other.CompareTag ( "Player" ) )
        {
            Instantiate ( playerExplosion, other.transform.position, other.transform.rotation );
            gameController.GameOver ();
        }

        gameController.AddScore ( scoreValue );

        Destroy ( other.gameObject );
        Destroy ( gameObject );
    }
}

生成するオブジェクトの数を必要以上に増やさないための方法はほかにもいくつかありますが、まずはこの3種類を基本として覚えておくと良いのではないでしょうか。

今回は以上です。