Unity中销毁游戏对象的方式

销毁方式

销毁物体的方式有两种: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

欢迎指正。

相关文章
相关标签/搜索