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是異步銷毀,一般在下一幀就會銷毀,不會影響主線程的進行。

歡迎指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM