Unity3D Destroy方法的细节

当我们想销毁一个集合中的所有物体时

很容易想到会这么做

List<GameObject> goes = new List<GameObject>(); 
        for (int i = 0; i < goes.Count; i++)
        {
            Destroy(goes[i]);
        }

用一个for循环

遍历到所有的物体

然后将每个物体 i 销毁

然而,再仔细想一下

当把第0个物体销毁了

那原来的第1个物体,不就是第0个物体了吗

按这个逻辑

不应该是Destroy(goes[0])吗

对的,这个逻辑没错

问题就出在Destroy这个api身上

Destroy会在当前帧结束的时候再把物体销毁

也就是说

当把第0个物体销毁时,当前帧此物体还在

想销毁下一个物体,自然是销毁物体1,而不是物体0

所以,在销毁前想要处理一些逻辑时

就需要注意到这一点

当然,也有办法可以将物体立马销毁,而不是在当前帧结束时销毁

DestroyImmediate

这个api可以执行立刻销毁的操作

也就是说,如果用这个api写文章最开始的逻辑,那么就是

List<GameObject> goes = new List<GameObject>(); 
        for (int i = 0; i < goes.Count; i++)
        {
            DestroyImmediate(goes[0]);
        }

没错,这里的参数就是0了

当然,Destroy也有延迟销毁的函数重载

Destroy(gameObject, 5);

这个API就是在5秒后再销毁gameObject

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注