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

kya*_*bal 12 c# architecture unity-game-engine

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

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

Pro*_*mer 15

组件:

Component对于两个基类BehaviourMonoBehaviour.它是可以附加到GameObject的任何脚本的基类.

这几乎是所有Unity 内置脚本的衍生出来的.这包括ColliderRigidbody.


行为:

最重要的是要知道Behaviour从它继承的任何东西都可以启用或禁用.如果您不希望启用/禁用它,请不要从此继承您的脚本.

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

Behaviour继承自Component.


MonoBehaviour:

需要注意的最重要的事情MonoBehaviour是,你需要它的时候,你必须使用corutines,调用,或任何统一的回调函数,如物理OnCollisionEnter功能,Start,OnEnable,OnDisable,等.

MonoBehaviour继承自Behaviour以便可以启用/禁用您的脚本.

是否有任何分离这些课程的目的?

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

你想协程,Invoke,InvokeRepeating并能够启用/禁用脚本?使用继承自MonoBehaviour.

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

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

请注意,BehaviourComponent通过统一的内部玩艺.您不应该尝试从这些继承您的脚本.

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

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

是.

  • MonoBehaviour继承直接从中Behaviour继承Component.

  • ColliderComponent直接继承.然后非碱撞机如BoxColliderSphereCollider从继承Collider.

  • “请注意,Unity将“行为”和“组件”用于内部内容。您不应尝试从中继承脚本。” 这与您所说的其他内容有些矛盾。当我读到它时,听起来就像您说的是永远不要从Behavior或Component继承。你是这个意思吗? (2认同)
  • 我知道这很令人困惑,但当我说"你"时,我并不是说像你这样的普通程序员.我主要指的是为Unity工作的程序员.我也指的是有助于[Unity的UI系统](https://bitbucket.org/Unity-Technologies/ui)开源的程序员.您将必须了解这些是如何工作的,为什么使用它们以及何时使用其中任何一个来做出贡献.如果您不是这些人中的任何一个,则不需要使用其中任何一个. (2认同)
  • 不,您不必将其存储为组件.一旦在MonoBehaviour中创建的另一个类中声明了该数据类,您将在Editor/Inspector中看到该数据类及其所有变量.它们必须声明为public,或者必须具有`[SerializeField]`如果是私有的. (2认同)