銷燬物體的方式有兩種: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
歡迎指正。