在Unity中,当我实现Update()以及来自MonoBehaviour的其他消息时,究竟是怎么回事

Ada*_*anc 5 c# game-engine unity-game-engine

我是C#的新手,来自Java,python和一些"网络"东西的强大背景.所以我可能只是缺少一些知识,希望有人可以为我填写.

通过Unity Scripting API,我注意到很多方法,列在"消息"下,这是我的第一个困惑点."消息"和"方法"之间究竟有什么区别,对我来说,他们看起来是相同的,但术语却让我失望.

我的第二个困惑点是,当我在派生类中实现像Update()这样的"Message"时,我不必使用override关键字.哪个是烦我的,因为我不会只是隐藏它吗?在这种情况下,更新循环不会只知道MonoBehaviour而不是我的派生类,并在MonoBehaviour中调用Update()而不是我的类吗?这让我陷入了困境.我很有趣这是在幕后发生的事情?

我和Unity以及C#相处得很好,这对我来说只是一个难点,我觉得我缺少一些知识.

Pro*_*tic 8

需要记住的一点是Unity团队不一定设计他们的脚本API(包括MonoBehaviour类)来促进良好的软件开发原则; 他们设计了它的可访问性和易用性(特别是对于非程序员).这种情况正在慢慢改变,但对于"什么是容易的"而不是"什么是正确的"仍然有很多惯性.

那就是说,让我们回答你的问题.关于"消息",请查看文档对Component.SendMessage的说法:

在此游戏对象中的每个MonoBehaviour上调用名为methodName的方法.

当您查看Collider的文档并查看"消息"部分下列出的方法时,这表明如果您实现这些方法,它们将被调用(通过SendMessage)以响应某些事件或操作(OnCollisionEnter,for例如,"当此对撞机/刚体开始接触另一个刚体/对撞机时调用.").我可能已经将它们实现为事件代理,但Unity团队选择使用字符串来实现自己的消息传递系统,再次以"易用性"的名义.

为了达到同样的效果,如果你走上MonoBehaviour类的继承链,你会注意到链中没有任何地方确实找到了命名的声明方法Update或者Start脚本的其他生命周期事件.如果它们存在于实现类中,Unity会将这些视为魔术方法并调用它们(再次通过SendMessage,它出现).这就是为什么你的Update方法是公共的还是受保护的甚至是私有的并不重要......它仍然会被调用.