- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Unity3d
中,您有 MonoBehaviour
类,它是所有脚本的普通基类。执行脚本时,必须执行 Awake()
或 Start()
或 Update()
等方法。
但是,这些方法在 MonoBehaviour
类中未作为虚拟
或抽象
实现,因此可以很容易地覆盖
他们;事实上,它们根本没有实现。 one write the Moment 的方法是类之前没有的新方法。
为什么这些方法没有在基类 (MonoBehaviour
) 中实现为 virtual
或 abstract
?
最佳答案
如果您查看文档,您会看到所有这些“功能”都列在“消息”部分; MonoBehaviour Doc .
所以这意味着“功能”(如 Start、OnEnable 或 Awake),它们不是作为方法而是作为消息来实现的。
现在,MonoBehaviour 继承自 Behaviour , 它继承自 Component其中有 SendMessage方法。该方法基本上调用消息/方法,如果消息/方法存在或不存在,则可以选择报告错误。名称消息/方法的参数是一个字符串,/~~所以他们在那里使用反射。~~/Check Update!!
似乎 Unity 在幕后确定是否已实现这些消息以查看是否必须调用它们。根据这个UnityAnswer :
Unity is mainly written in c++ and therefore most magic happens innative code. Unity uses reflection to determine, after your scriptshave been compiled, what of those "events" you've implemented andremember that for this class. Unity only calls Update / LateUpdate /OnGUI when it has been implemented.
因此,简短的回答是,它们不是您必须覆盖的“真实”方法,它们是仅在实现后才调用的消息。
更新;正如@Raining 指出的那样,Unity 获取要调用的消息的方式是错误的。Unity 不使用反射来做到这一点。根据这个1k-update-calls (也由@Rainin 提供)检查脚本以检查它们是否包含某些“魔术方法”。如果是这样,它们将被添加到将相应执行的列表中。
关于c# - 为什么没有为覆盖实现 MonoBehaviour 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32537997/
这个问题在这里已经有了答案: Declaring a new instance of a class in C# (2 个答案) 关闭 1 年前。 有没有一种方法可以实例化从 MonoBehavio
我正在尝试为我在 Unity 3D 中制作的游戏制作主脚本。 using System.Collections; using System.Collections.Generic; using Uni
有时我会看到 Unity 程序员如何使用一个脚本来继承几乎整个项目的 MonoBehavior。所谓的“更新管理器”。所有脚本都订阅到队列中执行,管理器运行所有函数,并在执行后将它们从队列中移除。 这
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Room : M
我已将脚本附加到 Unity 游戏对象。该脚本包含各种公共(public)属性,包括我自己的一些类。就像在下面的简化代码中一样,其中 TestMonoBehaviorClass 附加到游戏对象,Tes
我正在使用 Unity3d 和 MonoDevelop 在 Linux Mint(19.3 Cinnamon,64 位)上开发游戏。 但是,当我在 MonoDevelop 中打开 C# 脚本时,它无法
首先,我想简要介绍一下我的问题:我如何访问附加到另一个游戏对象的另一个代码片段,或者我如何在没有附加游戏对象的情况下初始化一个类。 当我在 Unity 中制作一个小游戏时,我制作了一个单位设计器,您可
我在 Unity 中有项目,也是 C# 的新手。问题是我收到错误脚本需要从 MonoBehaviour 派生。我明白这是什么意思,但是当我使用 MonoBehaviour 时,我遇到了很多这样的错误:
这个问题在这里已经有了答案: Use coroutine inside a non MonoBehaviour class (1 个回答) 关闭 6 年前。 编辑: 解决这个问题的答案确实在帖子的答
如何在非 Monobehaviour 类的实例中传递 Monobehaviour?我找到了这个 link其中 TonyLi 提到您可以传递 Monobehaviour 以在类的实例中启动和停止协程,但
在 Unity3d 中,您有 MonoBehaviour 类,它是所有脚本的普通基类。执行脚本时,必须执行 Awake() 或 Start() 或 Update() 等方法。 但是,这些方法在 Mon
假设我有一个名为 ObjectA 的对象,它包含两个对象:ObjectsB 和 ObjectC。 [System.Serializable] public ClassA { public Cl
背景:从 Monobehaviour 继承的类不能被序列化。 前提:一种保存 MonoBehaviour 脚本的数据(变量/字段及其值)的方法,以便可以对其进行序列化,然后再次反序列化并使用此数据“填
我在 Github 上有以下开源项目 ( game project )。我目前正在尝试对我使用 MSTest 框架编写的代码进行单元测试,但所有测试都返回相同的错误消息:“未处理的异常:System.
我有一个带有警告的 Unity 项目: The referenced script on this Behaviour is missing! 我已经确定了哪些游戏对象具有这些错误引用,并且我有一组脚
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 4 年前。 Improve
我在解决这个问题时遇到了麻烦,并且在谷歌上找不到任何帮助我的东西。 在unity中,如果脚本派生自MonoBehaviour,则不能使用“new”关键字实例化。美好的。所以我一直在研究如何做到这一点,
我有一个 Inventory:MonoBehaviour,它在 Start() 中加载一些模拟数据,包括一个已设置且可以读取的“selectedWeapon”变量。 假设我想在同一场景中设置另一个 M
using UnityEngine; using System.Collections; public class VariablesAndFunctions : MonoBehaviour {
我有一个“SingletonManager”类,其中包含“LevelManager”单例实例(及其接口(interface))。 “LevelManager”GameObject 不应在整个应用程序生
我是一名优秀的程序员,十分优秀!