销毁物体的三种方式
在 Unity 中,销毁物体有三种常见方式:SetActive、Destroy 和 DestroyImmediate。
1. 使用 SetActive
- 文档:文档
- 作用:通过设置物体的显示或隐藏来模拟销毁效果,但物体仍然存在于场景中。
- 特点:
- 物体在
Hierarchy面板中仍然可见。 - 不会触发
Awake和Start方法,但会触发OnEnable和OnDisable方法。 - 类似于在
Inspector中点击物体名称前的对勾。
- 物体在
代码示例
gameObject.SetActive(true); // 显示物体
gameObject.SetActive(false); // 隐藏物体
适用场景
- 需要频繁显示或隐藏物体时。
- 物体需要保留在场景中以便后续复用。
- 其他:如果要获取到物体是否启用使用:gameObjcet.activeSelf ,true启用,false未启用
2. 使用 Destroy
- 文档:文档
- 作用:真正销毁物体,物体从
Hierarchy面板中移除。 - 特点:
- 物体被销毁后,再次生成时会触发
Awake和Start方法。 - 物体在内存中并未立即释放,Unity 会在合适的时机进行垃圾回收。
- 物体被销毁后,再次生成时会触发
代码示例
Destroy(gameObject); //销毁物体
Destroy(gameObject.GetComponent<InputField>()); // 销毁物体上的 InputField 组件
Destroy(gameObject, 0.5f); // 0.5 秒后销毁物体
适用场景
- 需要彻底销毁物体时。
- 需要删除物体上的组件的时候。
- 需要延迟销毁物体时。
3. 使用 DestroyImmediate
- 文档:文档
- 作用:立即销毁物体,物体从
Hierarchy面板和内存中移除。 - 特点:
- 物体被销毁后,再次生成时会触发
Awake和Start方法。 - 立即释放内存,但性能开销较大。
- 官方强烈不建议使用,除非在特殊情况下(如编辑器脚本)。
- 物体被销毁后,再次生成时会触发
代码示例
DestroyImmediate(gameObject); // 立即销毁物体
适用场景
- 需要在编辑模式下立即销毁物体时。
- 需要立即释放内存时。
销毁父物体下的所有子物体
以下是两种常见方式:
方式 1:使用 DestroyImmediate
for (int i = 0; i < father.childCount; i++)
{
DestroyImmediate(father.GetChild(0).gameObject); // 从第一个子物体开始销毁
}
方式 2:使用 Destroy
for (int i = 0; i < father.childCount; i++)
{
Destroy(father.GetChild(i).gameObject); // 销毁每个子物体
}
区别
DestroyImmediate:- 立即销毁物体,适用于编辑器脚本。
- 在循环中需要从第一个子物体开始销毁(
GetChild(0)),因为每次销毁后子物体列表会更新。
Destroy:- 延迟销毁物体,适用于运行时。
- 在循环中可以直接遍历所有子物体。
2621






