Awake與Start函數的區別詳解

非原創,覺得說的很透徹,故轉載。
文章來源:http://blog.csdn.net/Haohan_Meng/article/details/21857029

在Unity中編寫腳本時,有一系列的可重寫(override)函數供我們使用,其中的Awake與Start兩個函數作爲初始化與設置之用,幾乎在每個腳本中都要用到。因此,正確的把握這兩個函數的調用時機,就能讓我們在程序開發過程中避免一些錯誤,提高開發效率。比較懶,所以就沒有上圖,歡迎大家的批評指正: )

Awake函數

首先,我們來看unity的參考手冊中對Awake函數的一些說明情況:

  1. 如果遊戲對象(即gameObject)的初始狀態爲關閉狀態,那麼運行程序,Awake函數不會執行;反之,如果遊戲對象的初始狀態爲開啓狀態,那麼Awake函數會執行。並且,值得注意的一點是,Awake函數的執行與否與腳本實例的狀態(啓用或禁用)並沒有關係,而是與腳本實例所綁定的遊戲對象的狀態有關。

  2. 在不切換場景的前提下,原本處於關閉狀態的遊戲對象,當它被首次開啓時,Awake函數會執行,並且是隻在首次開啓時纔會執行;而已經開啓(激活)的遊戲對象(Awake函數已經執行過一次),將它關閉後再次開啓,Awake函數不會再次執行。看來這是對應了手冊中說明的在腳本實例的整個生命週期中僅執行一次的情況。

  3. 如果重新加載場景,那麼場景內Awake函數的執行情況重新遵循上述兩點。

Start函數

還是先看參考手冊中對Start函數的一些說明情況:
當Update函數第一次被調用前會調用Start函數;Start函數只在腳本實例被啓用時纔會執行;Start函數總是在Awake函數之後執行。在此基礎之上,自己的測試總結如下 (沒有特殊說明,均爲在不切換場景的前提下):

  1. 如果遊戲對象被關閉,那麼Start函數不會執行。想一想這是理所當然的,遊戲對象關閉了,腳本實例不會被加載,Awake函數不會執行,Start函數不會執行,Update函數等也不會執行。
  2. 如果遊戲對象開啓了,對象上綁定的腳本實例被禁用了,那麼Start函數不會執行。這是Start函數的特點,只有在腳本實例被啓用時它纔會執行,這個說明中有提到。注意,這與Awake函數是有區別的。
  3. 如果遊戲對象開啓了,對象上綁定的腳本實例也開啓了,那麼Start函數會執行。並且Start函數只會在腳本實例首次被開啓時纔會執行。如果是已經開啓過的腳本實例被關閉後再次開啓,那麼Start函數不會再次執行。
  4. 如果重新加載場景,那麼場景內Start函數的執行情況重新遵循上述三點。

除此之外,還有對Awake函數和Start函數都比較重要的一點,那就是當遊戲對象之間存在父子關係時(不論層級的多少)。這時,父遊戲對象的狀態(開啓或關閉)完全決定了子游戲對象上的腳本函數的執行情況。總的來說就是,只有在父遊戲對象被開啓的狀態下,程序纔會考慮是否調用子游戲對象上的腳本函數(Awake與Start等)。自上而下,以此類推。

最後,自己對於Awake與Start函數的使用,一般都是在Awake函數中獲取遊戲對象或者腳本實例的信息,然後在Start函數中進行一些獲取之後的初始化設置。具體情況,還要根據需求靈活變化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章