如何在Unity3D中使用GameObject.Find("")查找非活动对象?

use*_*179 6 c# unity-game-engine

我需要使用C#在Unity3D中查找非活动对象.

我有64个对象,每当我单击一个按钮,它就会在运行时激活/停用相应按钮的对象.如何在此时找到非活动对象?

shi*_*or7 21

自 Unity 2020 起

对于 Unity 2023,请参阅此答案:/sf/answers/5395697821/

自从提出这个问题以来,Unity 准确地添加了您所需要的东西。至少,正是我需要的东西。在这里为未来的人们发帖。

要查找某种类型的对象,无论它是在活动的还是非活动的 GameObject 上,您可以使用FindObjectsOfType<T>(true)

inactiveObjects仅当设置为 时,才会包含附加到非活动游戏对象的对象true

因此,就像平常一样使用它,但也要传入true.

以下代码需要System.Linq

SpriteRenderer[] onlyActive = GameObject.FindObjectsOfType<SpriteRenderer>();

SpriteRenderer[] activeAndInactive = GameObject.FindObjectsOfType<SpriteRenderer>(true);

// requires "using System.Linq;"
SpriteRenderer[] onlyInactive = GameObject.FindObjectsOfType<SpriteRenderer>(true).Where(sr => !sr.gameObject.activeInHierarchy).ToArray();
Run Code Online (Sandbox Code Playgroud)

第一个数组仅包含活动游戏对象上的 SpriteRenderer,第二个数组包含活动和非活动游戏对象上的 SpriteRenderer,第三个数组仅System.Linq包含非活动游戏对象上的 SpriteRenderer。

  • 仍然要记住,这个电话的费用很高。因此,如果您的场景经常变化,您可能宁愿使用“static HashSet&lt;T&gt;”并让实例自行添加和删除(仅适用于我们的自定义组件,当然不适用于 Unity 内置组件) (2认同)

Bar*_*art 13

好吧,使用GameObject.Find(...)永远不会返回任何非活动对象.正如文件所述:

此函数仅返回活动的游戏对象.

即使你可以,你也希望将这些昂贵的电话保持在最低限度.

找到非活动的游戏对象有"技巧",例如使用Resources.FindObjectsOfTypeAll(Type type)呼叫(尽管应该非常谨慎地使用).

但最好的办法是编写自己的管理代码.这可以是一个简单的类,其中包含您可能希望在某些时候查找和使用的对象列表.您可以在首次加载时将对象放入其中.或者在成为活动或非活动时添加/删除它们.无论您的特定场景需要什么.


Dzi*_*mau 6

如果您有父对象(只是充当文件夹角色的空对象),您可以找到活动和非活动对象,如下所示:

this.playButton = MainMenuItems.transform.Find("PlayButton").gameObject;
Run Code Online (Sandbox Code Playgroud)

MainMenuItems - 是您的父对象。

请注意 Find() 是一种缓慢的方法,因此请考虑使用对对象的引用或使用您需要经常访问的游戏对象组织字典集合

祝你好运!