Menu
CoddyTech

销毁

本课属于 Coddy Unity 学习旅程的“Unity 脚本基础”单元。第 67 课,共 85 课。

Destroy(obj) 会从场景中移除一个 GameObject,包括它的子对象。第二个参数可以延迟移除: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 在线编辑器