破棄
CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 52/67。
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 の後にある行も実行され、フレームが終わるまではオブジェクトを見つけることができます。
チャレンジ
中級Chuteは毎秒コインを1枚落とします。この部分はすでに書かれています。次のように変更してください。
- 各コインが出現してから3秒後に消えるようにし、同時に存在するコインが3枚を超えないようにする。
- Spaceキーを押すとシュート自体が破棄され、それ以上コインが出てこないようにする。すでに出ているコインは、予定どおり消えます。
再生を押して数秒間観察し、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: シュートを破壊する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。