Component,Behavior和MonoBehaviour有什么区别?为什么这些是分开的?

时间:2017-06-14 09:28:38

标签: c# unity3d architecture

MonoBehaviour扩展了行为和行为扩展组件。 我想知道为什么这些类是分开的和这些类的语义含义。 是否有任何分离这些课程的目的?是否有任何类直接扩展行为或组件?

我知道我们必须使用MonoBehaviour在Unity中创建C#代码。 但是,我对Unity作为游戏引擎的架构感兴趣。

1 个答案:

答案 0 :(得分:13)

<强>组件

ComponentBehaviourMonoBehaviour的基类。它是可以附加到GameObject的任何脚本的基类。

这几乎是所有Unity 内置脚本的源代码。其中包括ColliderRigidbody

<强>行为

关于Behaviour最重要的一点是,可以启用或禁用从中继承的任何内容。如果你不希望它被启用/禁用,请不要从中继承你的脚本。

例如,无法启用/禁用Rigidbody。这就是为什么它继承自Component类而不是Behaviour

Behaviour继承自Component

<强> MonoBehaviour

关于MonoBehaviour最重要的一点是,当你必须使用corutines,Invoking或任何Unity回调函数(如物理OnCollisionEnter函数,Start)时,你需要它, OnEnableOnDisable

MonoBehaviour继承自Behaviour,因此您的脚本可以启用/停用。

  

是否有任何目的将这些类分开?

是的,就像上面的答案一样,它们是分开的,因此您可以通过从适当的组件继承来使用不同的功能。

你想要协程,InvokeInvokeRepeating并能够启用/禁用你的脚本吗?使用MonoBehaviour的继承。

您希望能够启用或禁用您的脚本,但不需要协程,InvokeInvokeRepeating?使用Behaviour

当你有一个永远不应该启用/禁用的脚本时,它应该继承自Component

请注意,Unity使用BehaviourComponent作为内部资料。您不应该尝试从这些脚本继承脚本。

分离这些内容的主要原因是为了节省内存并使每个组件中的代码易于维护。这比为很少使用的功能编写数千行代码要好。通过分离它们以及当它们被加载到存储器中时它们实际上被使用并且不会在存储器中浪费空间。

  

是否有任何类直接扩展行为或组件?

  • MonoBehaviour直接从Behaviour继承 继承自Component

  • Collider直接从Component继承。然后是非基地对撞机 例如BoxColliderSphereCollider继承自Collider