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