Почему методы MonoBehaviour не реализованы для переопределения?
В Unity3d
имеется класс MonoBehaviour
, который является обычным базовым классом для всех скриптов. При реализации скрипта необходимо реализовать такие методы, как Awake()
или Start()
или Update()
.
Однако эти методы не реализуются как virtual
или abstract
в классе MonoBehaviour
, чтобы можно было легко override
их; фактически они вообще не реализуются. Метод, который пишется в данный момент, является новым методом, которого класс не имел ранее.
Почему эти методы не являются реализовано как virtual
или abstract
в базовом классе (MonoBehaviour
)?
1 ответ:
Если вы проверите документацию, то увидите, что все эти "функции" перечислены в разделе "Сообщения"; MonoBehaviour Doc.
Это означает, что "функции" (например, Start, OnEnable или Awake) реализуются не как методы, а как сообщения.
Теперь MonoBehaviour наследует отповедения , которое наследует откомпонента , имеющего методSendMessage . Этот метод в основном вызывает сообщение / метод с возможностью сообщить ошибка, если сообщение/метод существует или нет. Параметр имени message / method-это строка, поэтому они используют отражение там.Похоже, что Unity за кулисами определяет, были ли эти сообщения реализованы, чтобы увидеть, нужно ли их вызывать. Согласно этому UnityAnswer :
Unity в основном написан на c++ , и поэтому большая часть магии происходит в машинный код. Unity использует отражение, чтобы определить, после ваших сценариев были составлены, что из те "события", которые вы осуществили и запомните это для этого класса. Unity вызывает только Update / LateUpdate / OnGUI, когда он был реализован.
Короче говоря, это не "реальные" методы, которые вы должны переопределить, это сообщения, которые вызываются только в том случае, если они были реализованы.