淺談Unity的腳本執行順序

1、添加腳本的順序安全

這是一張官方的腳本順序圖spa

 

通常,當咱們把腳本綁定在遊戲對象上時,或者點擊綁定好的腳本的reset按鈕時,會調用Reset()指針

當咱們初始化一個對象時,會先調用Awake()在調用OnEnable()code

GameObject.instantiate(o);

start()在第一次調用update()前調用,有時候start()會在Awake(),OnEnable()執行完後馬上執行,處於同一幀component

onDisable()和onDestroy()的執行順序有點特別:對象

第一種狀況:blog

  對於不一樣對象上的不一樣的腳本,執行是沒有前後規律的,且必須成對執行(調用完了onDisable()必須再調用onDestroy())索引

  eg:遊戲

gameobject1:
    sc1.cs
    sc2.cs
gameobject2:
    sc3.cs
    sc4.cs
gameobject3:
    sc5.cs
    sc6.cs

gameobject1.sc1.onDisable()->gameobject1.sc1.onDestroy()->gameobject3.sc5.onDisable()->ip

gameobject3.sc5.onDestroy()

[若是按前面的規則的話,應該先執行gameobject3的腳本,但這裏不是]

第二種狀況:

在同一個對象的不一樣的腳本上,這兩個方法按照腳本

在m_component中的索引按順序執行的,並且不是成對執行,索引自小到大執行,最先加入的最先調用onDisable()和onDestroy()

gemeobject2.sc3.onDisable()->gameobject2.sc4.onDisable()->

gameobject2.sc3.onDestroy->gameobject2.sc4.onDestroy()

這裏這些腳本先依次調用onDisable()才調用onDestroy()。

2、如何自定義多個腳本的執行順序

 

 劃重點:在unity裏面能夠點擊edit->project settings->Script->Execution Order中自定義腳本執行順序,

當咱們沒有設置腳本執行順序時,腳本按照Default Time的標準執行(你能夠把unity裏面hireachy裏面添加對象和在inspector裏面添加腳本

視做一個棧,按照先進先出原則,優先執行後添加的對象的先添加的Script。

能夠單擊+號添加對象到執行列表中

1是腳本的執行順序,當你的值execution order越小時,越先執行,在default time上方的在執行default time前執行,在default time下方

的在default time後執行

上面的設置,是經過修改每個腳本對應的meta文件(去本身的代碼目錄看一下)的excution order來實現的。

 

 3、腳本執行順序的本質

在咱們的場景文件.unity,場景文件是一個YAML文檔

 

 每個腳本對應一個fileid,fileid越小越有先執行

 4.運用

若是你的腳本A會用到另外一個腳本B中的某一個對象c,爲了防止你在B初始化以前去調用c,出現空指針,你必須讓腳本B在A以後掛載(這樣B就會先初始化),

還有一個很重要的地方,你必須把對象c的初始化寫在腳本B的Awake()方法裏面,由於start()並非在初始化就馬上調用的,而是在當前更新一幀時,start()

會在update()第一次調用前調用一次,這樣的話若是你把對象c的初始化寫在腳本B的start()方法裏面,頗有可能全部腳本的awake()都跑完了,對象c卻沒有初始化,

這樣就出現了空指針。所以,把對象c的初始化在腳本B的awake()方法,而把調用對象c寫在腳本A的start()足夠安全

相關文章
相關標籤/搜索