[Unity-20] Unity不同腳本之間的執行順序

我們都知道,Unity中某個腳本的執行順序是Awake、Start、Update、LateUpdate等,但是不同的腳本之間的執行順序是怎樣的呢?

例如我有兩個腳本Script1和Script2,那麼這兩個腳本的Awake執行順序是怎樣的呢?

要知道真相我們就必須瞭解Unity後臺的運行原理,其實Unity後臺是單線程執行的,所謂的協程都是僞多線程。不同腳本的Awake在後臺的執行真相是這樣的:

後臺Awake()
{
	腳本0Awake();
	腳本1Awake();
	........
}
Start、Update等函數也是相同的道理,那麼問題就來了,這麼多腳本,他們的執行順序到底是怎樣的呢?

這個關係我還真沒搞明白其中的規律,不過Unity提供了一個設置不同腳本之間執行順序的功能:

1、先在project窗口選中一個腳本文件,然後在Inspector卡中顯示如下:

2、點擊右上角Execution Order顯示如下:

3、點擊加號添加你想要排序的腳本文件。

4、拖動腳本文件進行排序。

這樣腳本就會按照你排的順序順次進行初始化。

我們之所以要設置腳本間的執行順序主要是爲了避免下面這種情況

public class Script1 : MonoBehaviour 
{
	void Awake ()
	{
		GameObject.CreatePrimitive(PrimitiveType.Cube);
	}
}

public class Script2 : MonoBehaviour 
{
 
	void Awake () 
	{
		GameObject go = GameObject.Find("Cube");
		Debug.Log(go.name);
	}
 
}
這樣如果Script2在Scirpt1之前執行的話,就會報錯。因此需要對腳本初始化順序進行設置。

但是還有另外一種方法來解決上述問題:

那就是在Script1的Awake創建cube,在Script2的Start訪問cube,這樣就不會出錯啦。

因爲後臺的也是嚴格按照Awake早於Start的順序執行的,也就是先把所有腳本的Awake執行完,然後再執行所有腳本的Start。




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