MonoBehaviour扩展了行为和行为扩展组件。 我想知道为什么这些类是分开的和这些类的语义含义。 是否有任何分离这些课程的目的?是否有任何类直接扩展行为或组件?
我知道我们必须使用MonoBehaviour在Unity中创建C#代码。 但是,我对Unity作为游戏引擎的架构感兴趣。
答案 0 :(得分:13)
<强>组件强>:
Component
是Behaviour
和MonoBehaviour
的基类。它是可以附加到GameObject的任何脚本的基类。
这几乎是所有Unity 内置脚本的源代码。其中包括Collider
和Rigidbody
。
<强>行为强>:
关于Behaviour
最重要的一点是,可以启用或禁用从中继承的任何内容。如果你不希望它被启用/禁用,请不要从中继承你的脚本。
例如,无法启用/禁用Rigidbody
。这就是为什么它继承自Component
类而不是Behaviour
。
Behaviour
继承自Component
。
<强> MonoBehaviour 强>:
关于MonoBehaviour
最重要的一点是,当你必须使用corutines,Invoking或任何Unity回调函数(如物理OnCollisionEnter
函数,Start
)时,你需要它, OnEnable
,OnDisable
等
MonoBehaviour
继承自Behaviour
,因此您的脚本可以启用/停用。
是否有任何目的将这些类分开?
是的,就像上面的答案一样,它们是分开的,因此您可以通过从适当的组件继承来使用不同的功能。
你想要协程,Invoke
,InvokeRepeating
并能够启用/禁用你的脚本吗?使用MonoBehaviour
的继承。
您希望能够启用或禁用您的脚本,但不需要协程,Invoke
,InvokeRepeating
?使用Behaviour
。
当你有一个永远不应该启用/禁用的脚本时,它应该继承自Component
。
请注意,Unity使用Behaviour
和Component
作为内部资料。您不应该尝试从这些脚本继承脚本。
分离这些内容的主要原因是为了节省内存并使每个组件中的代码易于维护。这比为很少使用的功能编写数千行代码要好。通过分离它们以及当它们被加载到存储器中时它们实际上被使用并且不会在存储器中浪费空间。
是否有任何类直接扩展行为或组件?
是
MonoBehaviour
直接从Behaviour
继承
继承自Component
。
Collider
直接从Component
继承。然后是非基地对撞机
例如BoxCollider
和SphereCollider
继承自Collider
。