Unity GetComponent未搜索其他对象



老实说,根据我无法判断的文档,GetComponent<T>()是否应该在场景中的所有对象中搜索组件?我有一个pub/sub设置,在一个名为<name>Publisher的场景中有各种EmptyObjects,即WorldPublisher\PlayerPublisher,我可以在其中附加各种需要的发布者。

我的想法是,我可以调用GetComponent<KeyBindingPublisher>(),这将返回该脚本。然而,我得到了一个null,所以它似乎无法从玩家GameObject中找到它。

我不想把pub/sub都连接到玩家GameObject上,因为它感觉耦合得太紧密了。

我目前正在做这个:

GameObject playerEvents = GameObject.Find("PlayerPublishers");
KeyBindingPublisher keyBindingPublisher = playerEvents.GetComponent<KeyBindingPublisher>();

这似乎确实有效,但似乎将订阅者脚本和UI紧密结合在一起,而我正试图避免这种情况。我可能不需要放置PlayerPublishers对象,所以只想在不了解所有对象的情况下获得脚本的引用。

当你调用GameObject.GetComponent时,它将搜索连接到你调用它的特定GameObject的匹配组件。如果你想在搜索中包括其他GameObject,你有几个选项:

  • GameObject.GetComponentInChildren将搜索该游戏对象及其所有子对象
  • GameObject.GetComponentInParent将搜索该GameObject及其所有父对象
  • Object.FindObjectOfType将搜索所有加载的Unity对象

如果您正在搜索多个对象,则会有类似的函数返回匹配数组。

正如您可能想象的那样,广撒网可能会对性能产生影响。理想情况下,搜索整个场景应该保持在最低限度。

如果您正在寻找KeyBindingPublisher的一个实例,其他脚本可以在所有场景中引用该实例,那么您可能会研究一种称为singleton的设计模式。以下是GameDev Stack Exchange的一个示例,其中包括一些在Unity3D中实现此功能的代码示例。

最新更新