销毁
本课属于 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 后面的代码行仍会运行,而且在当前帧结束前仍能找到该对象。
挑战
中等清除旧硬币,并让 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 在线编辑器