天天看點

【Unity3D日常開發】Unity中Destroy()函數 和 DestroyImmediate()函數的差別

推薦閱讀
  • ​​GitHub開源位址​​
  • ​​Unity3D插件分享​​
  • ​​簡書位址​​
  • ​​我的個人部落格​​
  • ​​QQ群:1040082875​​

大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時更新Unity開發技巧,覺得有用記得一鍵三連哦。

一、前言

Destroy()函數 和 DestroyImmediate()函數的差別

【Unity3D日常開發】Unity中Destroy()函數 和 DestroyImmediate()函數的差別

目标:

這篇文章的目标是了解Destroy()函數和DestroyImmediate()函數之間的差別。

這兩個函數的最終作用是相同的,都是去銷毀遊戲物體,但唯有一點點小差別,我們去了解這個小差別是非常重要的,錯誤的使用這些函數可能會導緻你的應用層序崩潰。

下面,用一點理論,和測試代碼去了解它。

二、正文

Destroy():

  • 該函數接收一個GameObject類型的參數
  • 該函數在目前幀結束後設定傳入的GameObject參數對象為Null

文法:Destroy(GameObject);

讓我們看一下測試代碼:

【Unity3D日常開發】Unity中Destroy()函數 和 DestroyImmediate()函數的差別

建立一個新的腳本,并為該腳本添加如上代碼,然後把該腳本綁定到場景中的Main Camera上,點選Play進行測試。然後在點選Play後在場景中按下滑鼠左鍵,此時你會發現在Hierarchy面闆中多了一個名為myObject的遊戲物體,這時按下鍵盤的空格鍵去銷毀該遊戲物體,然後點選console視窗檢視Log資訊。此時你會看到我們的status列印出了true,然後我們的currObject的名字也被列印出來了。這說明我們的遊戲物體在此時(目前幀中)還是存在的。

【Unity3D日常開發】Unity中Destroy()函數 和 DestroyImmediate()函數的差別

好了,現在讓我們看一下DestroyImmediate()函數

DestroyImmediate()

  • 正如它的名字顯示所示(Immediate意思為立刻、立即),當GameObject類型參數傳遞進來時,隻要一執行該函數,則該遊戲物體就會立刻銷毀。
  • 該函數會立馬銷毀物體,不會等到目前幀結束之後才銷毀物體
  • 文法:DestroyImmediate(GameObject)

現在,讓我們在上面的代碼中取消DestroyImmediate(currObject)的注釋,如下所示:

【Unity3D日常開發】Unity中Destroy()函數 和 DestroyImmediate()函數的差別

如上操作,點選Play按鈕,按下滑鼠左鍵,然後再按下鍵盤上的空格鍵,打開Console視窗檢視Log資訊。這時你會發現,我們的status變為了false,currObject的名字為Null了,說明遊戲物體已經被真正的銷毀了。

【Unity3D日常開發】Unity中Destroy()函數 和 DestroyImmediate()函數的差別

總結:

Destroy()函數在目前幀結束後才會真正的銷毀物體(也就是讓GameObject設定為Null),然而DestroyImmediate()函數則是直接在目前幀銷毀物體(也就是讓GameObject設定為Null)。

要小心使用DestroyImmediate()函數,根據官方文檔,你應該盡量避免使用DestroyImmediate。

附上官方中文文檔圖(Unity聖典的):

【Unity3D日常開發】Unity中Destroy()函數 和 DestroyImmediate()函數的差別

Destroy()函數

【Unity3D日常開發】Unity中Destroy()函數 和 DestroyImmediate()函數的差別