Unity中销毁游戏对象的方式

销毁方式

销毁物体的方式有两种:Destroy和DestroyImmediate两种,那两者有什么区别呢?细听分说。

两种方式都能达到销毁物体的目的,有以下区别:

Destroy销毁场景中的物体但是内存还存在,或一段时间没有再次被使用,才会销毁并且释放内存,这样避免了频繁对内存的读写操作,系统回收器会定时清理内存中没有被引用的对象,很可能有些地方你依然引用了该对象在你自己都不知道的地方,或者你忽略的地方,直接销毁会导致引用地方出现空引用的引用错误。

DestroyImmediate则是立即销毁对象,并从内存中移除掉。

例子

比如说你要销毁某一物体下的10个子物体,假设是要销毁A物体下的a0--a9,10个子物体

 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个。

但如果是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是异步销毁,一般在下一帧就会销毁,不会影响主线程的进行。

欢迎指正。

 

posted @ 2019-05-27 16:04  答案-Answer  阅读(11023)  评论(0编辑  收藏  举报