Menu
CoddyTech

破棄

CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 67/85。

Destroy(obj)は、子オブジェクトも含めてGameObjectをシーンから削除します。第2引数を指定すると削除を遅らせられます。Destroy(obj, 2f)は、今から2秒後に削除し、呼び出したスクリプトはすぐに処理を続けます。この大砲はSpaceキーを押すと発射され、生成した弾丸はそれぞれ2秒後に消えます。

public GameObject bulletPrefab;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        GameObject bullet = Instantiate(bulletPrefab, transform.position, Quaternion.identity);
        Destroy(bullet, 2f);
    }
}

プレハブではなく、そのコピーを渡してください。Destroy(bulletPrefab)は、Destroying assets is not permitted to avoid data loss.というエラーが出て拒否されます。また、オブジェクトを指定する場合はGameObjectを渡してください。スクリプト内では、gameObjectはそのスクリプトがアタッチされているオブジェクトを指すため、Destroy(gameObject)はそのオブジェクトを削除します。一方、Destroy(this)はスクリプトだけを削除し、オブジェクトは残します。

Destroyはその場ですぐに実行されるわけではありません。Unityは現在のフレームの最後に、そのフレームのUpdate()とLateUpdate()の呼び出し後にオブジェクトを削除します。そのため、Destroyの後にある行も実行され、フレームが終わるまではオブジェクトを見つけることができます。

challenge icon

チャレンジ

中級

古いコインを消し、Spaceキーで排出口を削除できるようにしましょう。

  1. 新しいコイン GameObject coin = Instantiate(...); を保持し、その後 Destroy(coin, 3f); を呼び出します。
  2. Input.GetKeyDown(KeyCode.Space) のとき、Destroy(gameObject); を呼び出します。Destroy(this) ではスクリプトだけが削除されます。

「プレイ」を押します。各コインは3秒後に消え、Spaceキーで新しいコインの生成が止まります。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

public class CoinChute : MonoBehaviour
{
    public GameObject coinPrefab;
    public float interval = 1f;
    float timer;

    void Update()
    {
        timer += Time.deltaTime;
        if (timer >= interval)
        {
            Instantiate(coinPrefab, transform.position, Quaternion.identity);
            timer -= interval;
        }

        // Space: シュートを破壊する
    }
}

Unityスクリプトの基礎のすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド