2017-02-19 64 views
1

Unity如何在場景後面調用Awake,Update和Start方法?他們對我沒有訪問修飾符表示它們是私有方法,並且它們不使用任何新的或重寫的內容,那麼Unity框架如何找到調用它們的方法?Unity私有喚醒更新和啓動方法如何工作?

在相關的問題上,是否有任何特定的原因虛擬方法沒有被使用?

編輯:對於那些不熟悉統一的腳本,這是他們通常的顯示:

public class MyClass : MonoBehaviour{ 
    void Start(){ 
    } 

    void Awake(){ 
    } 

    void Update(){ 
    } 
} 

什麼我不明白的是框架如何自動查找並要求每個腳本的方法時,所有出場,他們看起來只是私有方法

+0

@DavidTorry你可能會得到答案的一個更好的機會,如果你表現出一些示例代碼,以便非統一的用戶可以幫助你呢? – CKing

+0

@CKing編輯給出了一個腳本開始的基本示例,如 –

+0

最有可能的是反思。你不得不問Unity3D作者或反編譯他們自己的代碼,以確定。 –

回答

1

這裏是在Unity blog post

一條信息如何更新被稱爲

不,統一不使用的System.Reflection每次需要調用一個時間去尋找一個神奇的方法。

而是,第一次訪問給定類型的MonoBehaviour時,通過腳本運行時(Mono或IL2CPP)檢查底層腳本是否定義了任何魔術方法並緩存該信息。如果MonoBehaviour具有特定的方法,則將其添加到適當的列表中,例如,如果腳本具有定義的Update方法,則將其添加到每幀需要更新的腳本列表中。

在遊戲過程中團結剛剛經歷這些列表進行迭代,並且從它執行方法 - 就這麼簡單。另外,這就是爲什麼你的Update方法是公有還是私有並不重要。

+0

這對於使用虛擬方法是否有優勢? –

+0

@DavidTorrey在我看來,答案並不全面,它沒有正確解決問題。 –

1

原因的方法不是虛擬的是性能。如果它是虛擬的,那麼每一個MonoBehaviour都需要所有相關的方法(開始,喚醒,更新,固定更新等),這是一件壞事。