Unity中Awake與Start函數的調用情況總結(轉)


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

 

1、  Awake函數

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

        當腳本實例被加載時會調用Awake函數;Awake函數在所有的游戲對象被初始化完畢之后才會被調用;在腳本實例的整個生命周期中,Awake函數僅執行一次。那么,腳本實例何時被加載,腳本實例的整個生命周期又代表了什么,因為對這些概念存有疑惑,所以在此基礎之上,自己又在引擎中進行了一些測試,通過打印輸出的方式查看了一下Awake函數的執行情況,總結如下(沒有特殊說明,均為在不切換場景的前提下):

 

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

 

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

 

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

 

2、  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函數中進行一些獲取之后的初始化設置。具體情況,還要根據需求靈活變化。總結就到這里了,謝謝大家的閱讀,歡迎批評指正。

 

 

 

 

 

http://blog.csdn.net/haohan_meng


免責聲明!

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



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