销毁物体的方式有两种:Destroy和DestroyImmediate两种,那二者有什么区别呢?细听分说。异步
两种方式都能达到销毁物体的目的,有如下区别:spa
Destroy销毁场景中的物体可是内存还存在,或一段时间没有再次被使用,才会销毁而且释放内存,这样避免了频繁对内存的读写操做,系统回收器会定时清理内存中没有被引用的对象,极可能有些地方你依然引用了该对象在你本身都不知道的地方,或者你忽略的地方,直接销毁会致使引用地方出现空引用的引用错误。线程
DestroyImmediate则是当即销毁对象,并从内存中移除掉。code
好比说你要销毁某一物体下的10个子物体,假设是要销毁A物体下的a0--a9,10个子物体orm
1 ///<summary> 2 ///脚本挂在A物体上 3 /// <summary> 4 public class AGameOnject: MonoBehaviour 5 { 6 7 void Start () 8 { 9 for (int i = 0; i < transform.childCount; i++) { 10 Destroy (transform.GetChild (i).gameObject); 11 } 12 } 13 14 }
经过以上代码就可实现销毁了A下全部子物体,可是有些人会有疑问,为何这个地方是GetChild(i),每删除一个后面的物体不该该向前移吗?索引会减一的。对象
因此这就是Destroy的机制,在执行了Destroy后,程序并不能当即检测到该物体被销毁了获取数量是依然是10个。blog
但若是是DestroyImmediate就不能这样写了,以下:索引
1 public class AGameObject : MonoBehaviour 2 { 3 4 void Start () 5 { 6 int count = transform.childCount; 7 for (int i = 0; i < count; i++) { 8 DestroyImmediate (transform.GetChild (0).gameObject); 9 } 10 11 } 12
13 }
由于DestroyImmediate 一执行就会当即销毁,并释放内存,数量就会减一,后面的物体的索引就会向前移动。内存
DestroyImmediate 一旦销毁就会当即销毁,并释放内存。执行这个操做须要消耗更多时间,影响主线程进行,而Destroy是异步销毁,通常在下一帧就会销毁,不会影响主线程的进行。io
欢迎指正。