为什么MonoBehaviour方法没有实现重写

本文关键字:实现 重写 MonoBehaviour 方法 为什么 | 更新日期: 2023-09-27 18:12:22

Unity3d中,您有MonoBehaviour类,这是所有脚本的正常基类。在实现脚本时,必须实现Awake()Start()Update()等方法。

然而,这些方法没有在MonoBehaviour类中实现为virtualabstract,因此可以轻松地override它们;事实上,它们根本没有实现。当前编写的方法是类之前没有的新方法。

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

为什么MonoBehaviour方法没有实现重写

如果你检查文档,你会看到所有这些'函数'都列在'消息'部分;MonoBehaviour Doc .

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

现在,MonoBehaviour继承自Behaviour,而Behaviour继承自拥有SendMessage方法的Component。该方法基本上调用一个消息/方法,并带有在消息/方法存在或不存在时报告错误的选项。名称消息/方法的参数是一个字符串,/~~,所以他们在那里使用反射。~~/检查更新!

似乎Unity在幕后决定这些消息是否被执行,看看它是否必须调用它们。根据这个UnityAnswer:

Unity主要是用c++编写的,因此大多数神奇的事情发生在本机代码。Unity使用反射来确定脚本之后已经编好了,那些"事件"呢?你已经实现了记住这堂课。Unity只调用Update/LateUpdate/OnGUI,当它已经实现。

所以,简短的回答是,它们不是你必须重写的"真正的"方法,它们是只有当它们被实现时才被调用的消息。


;正如@ rain所指出的,我在Unity获取消息调用的方式上是错误的。Unity并没有使用反射来做到这一点。根据这1k更新调用(也由@Rainin提供)脚本检查,以检查它们是否包含一些"魔法方法"。如果是,它们将被添加到相应的列表中。