为什么MonoBehaviour方法没有实现覆盖?

Unity3d您拥有MonoBehaviour类,它是所有脚本的普通基类。 在实现脚本时,必须实现诸如Awake()Start()Update()

但是,这些方法在MonoBehaviour类中没有实现为virtualabstract ,因此可以轻松override它们; 实际上它们根本没有实现。 在Moment写的方法是一个新的方法,该类没有事先。

为什么这些方法在基类( MonoBehaviour )中没有实现为virtualabstract

如果您查看文档,您将看到“消息”部分中列出了所有这些“function”; MonoBehaviour Doc 。

这意味着’函数’(如,Start,OnEnable或Awake),它们不是作为方法实现的,而是作为消息实现的。

现在,MonoBehaviourinheritance自Behavior ,它inheritance自具有SendMessage方法的Component 。 该方法基本上调用消息/方法,如果消息/方法存在,则可以选择报告错误。 名称message / method的参数是一个字符串,因此它们在那里使用reflection。

看起来像Unity幕后确定是否实现了这些消息,看它是否必须调用它们。 根据这个UnityAnswer :

Unity主要用c ++编写,因此大多数魔法都发生在本机代码中。 在编译脚本之后,Unity使用reflection来确定您已实现的那些“事件”,并记住该类的内容。 Unity仅在实现时调用Update / LateUpdate / OnGUI。

因此,简短的回答是,它们不是您必须覆盖的“真实”方法,它们是仅在实现时才被调用的消息。