【Unity】Destroy和DestroyImmediate的区别

情景:有一个父物体A,A有子物体B1.B2.B3……B10等10个子物体
那么现在若想移除B1—B10,该如何?
我能想到的最简单是这样做

    using UnityEngine;  
    using System.Collections;  
    /// <summary>  
    /// 脚本位置:将此脚本挂载到父物体A身上  
    /// 脚本功能:用于测试销毁所有子物体  
    /// </summary>  
    public class Parent : MonoBehaviour  
    {  

        void Start ()  
        {  
            for (int i = 0; i < transform.childCount; i++) {  
                Destroy (transform.GetChild (i).gameObject);  
            }  
        }  

    }  
  • 第一眼看下去,好像没什么不对,粘贴到工程里试一试,也OK
    没错,这段程序没有问题的,但是不知道大家有没有注意
    Destroy里面的GetChild(i)为什么是i呢,i是不是从0到9?
    没错,i从0开始,i++肯定是一直递增的,但是它能不能加到9就是另外一回事了
    因为这取决于transform.childCount的值

  • 运行测试之后,所有子物体确实已经销毁,打印输出i的值,是0—9
    那么这一切都说明,当我们使用Destroy销毁物体的时候,程序不能立刻检测到这个物体被销毁了,所以获取子物体数量的时候,依然获取到的是有10个子物体

  • 所以,这个时候使用Destroy销毁对象的时候不是我们想象的那个样子
    我们想象的是什么样子?你怎么知道我在想什么

  • List大家应该都比较熟悉,当List中有10个对象的时候,如果RemoveAt掉了第0个,那么后面的9个对象都会向前移动,只要执行10次RemoveAt(0)那么就会清空List

  • 但是被Destroy的游戏对象不会发生类似List中移除对象的情况,销毁了第0个子物体,第1个子物体还在原来的位置,程序不能立即检测到到它被销毁了,需要过几帧之后才能检测到

如果想实现List一样的效果,那么需要使用DestroyImmediate这个方法
代码就变成这个样子

public class Parent : MonoBehaviour
{

    void Start ()
    {  
        int count = transform.childCount;
        for (int i = 0; i < count; i++) {  
            DestroyImmediate (transform.GetChild (0).gameObject);
        }  

    }

}  

最后,官方推荐使用Destroy代替DestroyImmediate

原因是DestroyImmediate是立即销毁,立即释放资源,做这个操作的时候,会消耗很多时间的,影响主线程运行
Destroy是异步销毁,一般在下一帧就销毁了,不会影响主线程的运行。

  • 14
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zok93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值