在具有多个 T 类型组件的 GameObject 上调用 GetComponent<T> 时,Unity 如何决定 return 哪个组件?

How does Unity decide which Component to return when calling GetComponent<T> on a GameObject with multiple components of type T?

如果我有一个 GameObject 附加了多个相同类型的 Component 类(出于示例目的,我们称此类型为 HingeJoint),其中 HingeJoint 如果我在 GameObject 上调用函数 GetComponent<HingeJoint>(),我会得到组件吗?

根据我的研究, 声称 Unity 将简单地 return 来自 Component 数组的第一个匹配项——但是,答案只是基于以下内容的有根据的猜测回答者自己的游戏引擎设计,努力模仿 Unity 而不是 Unity 实际功能的权威来源。

Unity 中的每个对象及其子对象都分层放置在一个集合中。您可以将其称为 "WYSIWYG",因为如您所见,场景层次结构中的每个对象都按照它们在该列表中显示的相同顺序加载。同样的事情也适用于组件,这也是为什么 Transform 组件被放置在所有其他组件之上的主要原因。

GetComponent 将从列表顶部看到的 Components 集合中的第一项 return。为准确确定哪个组件将被 returned,您可以在检查器视图中按需要订购它们。


来自documentation page

The order you give to components in the Inspector window is the order you need to use when querying components in your user scripts. If you query the components programmatically, you’ll get the order you see in the Inspector.

已编辑 m.rogalski 更正

手册指出组件是按照您将它们放入检查器的顺序检查的,因此 GetComponent() 将为您提供第一个类型 T

但是 我建议不要使用检查员排序,而是使用

GetComponents<T>()

要全部检索它们并动态选择您需要的一个(如果需要,请参阅 doc

这是因为 如果您的组件的顺序很重要,那么您将很难维护您的项目。从事该项目的任何其他人都需要知道这些组件必须放置的约定。即使你一个人工作,在添加或删除组件时也需要非常小心,如果出现错误,你的IDE将无法给你一个明确的错误