Unity在GameObject上调用GetComponent<T>时,如何决定返回哪个类型为T的Component?

4
如果我有一个附加了多个相同类型(例如,我们将其称为HingeJoint)的组件类的GameObject,如果我在我的GameObject上调用GetComponent()函数,我会得到哪个HingeJoint组件?
根据我的研究,这个答案声称Unity将简单地从Component数组中返回第一个匹配项。然而,这个答案只是基于回答者自己的游戏引擎设计的经验之谈,旨在模仿Unity,而不是关于Unity实际操作的权威来源。this answer

也许这并没有被记录下来,因为如果你有一个特定的需求,你可以使用GetComponents并选择你想要的那个。这样留下GetComponent自由返回一个任意的对象,他们不需要在未来版本中保证“合同上”的保证。 - Damien_The_Unbeliever
2个回答

5

在m.rogalski的纠正后编辑

手册指出组件是按你在检查器中放置的顺序进行检查的,所以GetComponent()将给你类型为T的第一个组件。

然而,我建议不要使用检查器顺序,而是使用

GetComponents<T>()

要检索它们并动态选择所需的一个(如果需要,请参阅文档),这是因为如果组件的顺序很重要,那么维护项目将变得非常困难。任何其他在项目上工作的人都需要知道这些组件必须放置的约定。即使你独自工作,添加或删除组件时也需要非常小心,而且如果出现错误,你的IDE将无法给出明确的错误信息。

有一个保证,关于哪个组件将被退回,请先阅读文档。 - mrogal.ski
没必要居高临下。GetComponent 的文档没有提到那个问题。但你是对的,我会编辑我的答案关于顺序的部分。我仍然认为使用这种约定是不好的做法。 - Basile Perrenoud
这甚至不是坏习惯,循环遍历所需类型的组件更方便,您可以找到需要的组件,而不是依赖于集合的顺序。 - mrogal.ski
我认为这就是我所说的。循环所需组件是可以的。但我认为哪些是所需的逻辑应该在代码中。 - Basile Perrenoud

5
在Unity中,每个对象及其子对象都按层次结构放置在一个集合中。你可以称之为“所见即所得”(WYSIWYG),因为你在场景层次结构中看到的每个对象都是按照它们在列表中显示的顺序加载的。组件也是同样的道理,这也是为什么Transform组件放在其他组件之上的主要原因。
GetComponent将返回从列表顶部可见的Components集合中的第一项。为确切确定将返回哪个组件,你可以在检查器视图中按照自己的意愿对它们进行排序。

来自文档页面

在检查器窗口中给组件的顺序就是在用户脚本中查询组件时需要使用的顺序。如果您以编程方式查询组件,则会得到在检查器中看到的顺序。


谢谢,这正是我在寻找的答案。既简洁又清晰--你太棒了!! - Jimmy Huch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接