2015-09-12 13 views
5

W Unity3d masz klasę MonoBehaviour, która jest normalną klasą podstawową dla wszystkich skryptów. Podczas implementacji skryptu należy wdrożyć takie metody, jak Awake() lub Start() lub Update().Dlaczego metody MonoBehaviour nie są zaimplementowane do nadpisania?

Jednak metody te nie są realizowane jako virtual lub abstract w klasie MonoBehaviour tak, że można je łatwo override; w rzeczywistości nie są one w ogóle realizowane. Metoda, którą pisze się w chwili jest nową metodą, której klasa nie miała wcześniej.

Dlaczego te metody nie są implementowane jako virtual lub abstract w klasie bazowej (MonoBehaviour)?

Odpowiedz

6

Jeśli zaznaczysz dokumentację, zobaczysz, że wszystkie te "funkcje" są wymienione w sekcji "Wiadomości"; MonoBehaviour Doc.

Oznacza to, że "funkcje" (takie jak Start, OnEnable lub Awake) nie są implementowane jako metody, lecz jako wiadomości.

Teraz MonoBehaviour dziedziczy po Behaviour, który dziedziczy po Component, który ma metodę SendMessage. Ta metoda w zasadzie wywołuje komunikat/metodę z opcją zgłaszania błędu, jeśli komunikat/metoda istnieje, lub nie. Parametrem komunikatu/metody name jest ciąg znaków, więc używają tam odzwierciedlenia.

Wygląda na to, że jedność za kulisami określa, czy te wiadomości zostały zaimplementowane, aby sprawdzić, czy ma do nich zadzwonić, czy nie. Zgodnie z tym UnityAnswer:

jedność jest przede wszystkim napisany w C++, a zatem najbardziej magia dzieje się w natywnego kodu. Unity używa refleksji do określenia, po skompilowaniu skryptów, które z tych "zdarzeń" zaimplementowałeś i zapamiętaj, że dla tej klasy. Wywołuje tylko Unity Update/LateUpdate/ OnGUI po zaimplementowaniu.

Krótko mówiąc, nie są to "prawdziwe" metody, które trzeba zastąpić, są to komunikaty wywoływane tylko wtedy, gdy zostały zaimplementowane.

Powiązane problemy