破棄
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の後にある行も実行され、フレームが終わるまではオブジェクトを見つけることができます。
チャレンジ
中級古いコインを消し、Spaceキーで排出口を削除できるようにしましょう。
- 新しいコイン
GameObject coin = Instantiate(...);を保持し、その後Destroy(coin, 3f);を呼び出します。 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プレイグラウンド