我們都知道,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。