Почему методы MonoBehaviour не реализованы для переопределения?


В Unity3d имеется класс MonoBehaviour, который является обычным базовым классом для всех скриптов. При реализации скрипта необходимо реализовать такие методы, как Awake() или Start() или Update().

Однако эти методы не реализуются как virtual или abstract в классе MonoBehaviour, чтобы можно было легко override их; фактически они вообще не реализуются. Метод, который пишется в данный момент, является новым методом, которого класс не имел ранее.

Почему эти методы не являются реализовано как virtual или abstract в базовом классе (MonoBehaviour)?

1 5

1 ответ:

Если вы проверите документацию, то увидите, что все эти "функции" перечислены в разделе "Сообщения"; MonoBehaviour Doc.

Это означает, что "функции" (например, Start, OnEnable или Awake) реализуются не как методы, а как сообщения.

Теперь MonoBehaviour наследует отповедения , которое наследует откомпонента , имеющего методSendMessage . Этот метод в основном вызывает сообщение / метод с возможностью сообщить ошибка, если сообщение/метод существует или нет. Параметр имени message / method-это строка, поэтому они используют отражение там.

Похоже, что Unity за кулисами определяет, были ли эти сообщения реализованы, чтобы увидеть, нужно ли их вызывать. Согласно этому UnityAnswer :

Unity в основном написан на c++ , и поэтому большая часть магии происходит в машинный код. Unity использует отражение, чтобы определить, после ваших сценариев были составлены, что из те "события", которые вы осуществили и запомните это для этого класса. Unity вызывает только Update / LateUpdate / OnGUI, когда он был реализован.

Короче говоря, это не "реальные" методы, которые вы должны переопределить, это сообщения, которые вызываются только в том случае, если они были реализованы.