推薦閱讀
- GitHub開源位址
- Unity3D插件分享
- 簡書位址
- 我的個人部落格
- QQ群:1040082875
大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時更新Unity開發技巧,覺得有用記得一鍵三連哦。
一、前言
Destroy()函數 和 DestroyImmediate()函數的差別
目标:
這篇文章的目标是了解Destroy()函數和DestroyImmediate()函數之間的差別。
這兩個函數的最終作用是相同的,都是去銷毀遊戲物體,但唯有一點點小差別,我們去了解這個小差別是非常重要的,錯誤的使用這些函數可能會導緻你的應用層序崩潰。
下面,用一點理論,和測試代碼去了解它。
二、正文
Destroy():
- 該函數接收一個GameObject類型的參數
- 該函數在目前幀結束後設定傳入的GameObject參數對象為Null
文法:Destroy(GameObject);
讓我們看一下測試代碼:
建立一個新的腳本,并為該腳本添加如上代碼,然後把該腳本綁定到場景中的Main Camera上,點選Play進行測試。然後在點選Play後在場景中按下滑鼠左鍵,此時你會發現在Hierarchy面闆中多了一個名為myObject的遊戲物體,這時按下鍵盤的空格鍵去銷毀該遊戲物體,然後點選console視窗檢視Log資訊。此時你會看到我們的status列印出了true,然後我們的currObject的名字也被列印出來了。這說明我們的遊戲物體在此時(目前幀中)還是存在的。
好了,現在讓我們看一下DestroyImmediate()函數
DestroyImmediate()
- 正如它的名字顯示所示(Immediate意思為立刻、立即),當GameObject類型參數傳遞進來時,隻要一執行該函數,則該遊戲物體就會立刻銷毀。
- 該函數會立馬銷毀物體,不會等到目前幀結束之後才銷毀物體
- 文法:DestroyImmediate(GameObject)
現在,讓我們在上面的代碼中取消DestroyImmediate(currObject)的注釋,如下所示:
如上操作,點選Play按鈕,按下滑鼠左鍵,然後再按下鍵盤上的空格鍵,打開Console視窗檢視Log資訊。這時你會發現,我們的status變為了false,currObject的名字為Null了,說明遊戲物體已經被真正的銷毀了。
總結:
Destroy()函數在目前幀結束後才會真正的銷毀物體(也就是讓GameObject設定為Null),然而DestroyImmediate()函數則是直接在目前幀銷毀物體(也就是讓GameObject設定為Null)。
要小心使用DestroyImmediate()函數,根據官方文檔,你應該盡量避免使用DestroyImmediate。
附上官方中文文檔圖(Unity聖典的):
Destroy()函數