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

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

我有64个对象,每当我单击一个按钮,它就会在运行时激活/取消激活相应按钮的对象。 我怎样才能找到不活动的对象?

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

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

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

查找非活动GameObjects有“技巧”,例如使用Resources.FindObjectsOfTypeAll(Type type)调用(尽管应该极其谨慎地使用)。

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

虽然它不是正确答案,但这就是我在我的案例中所做的。
1)将脚本附加到(非活动)游戏对象,而不是设置然后非活动状态保持活动状态。
2)将它们放在某处的场景之外。
3)在脚本中设置一个标志为无效的标志。
4)在Update()中检查此非活动标志,如果为false则跳过函数调用。
5)当需要对象时,将其放置在适当的位置并将标志设置为活动状态。

这将是一个性能问题,但这是迄今为止我能想到的唯一解决方法。

如果您有父对象(只是扮演文件夹角色的空对象),您可以找到这样的活动和非活动对象:

 this.playButton = MainMenuItems.transform.Find("PlayButton").gameObject; 

MainMenuItems – 是您的父对象。

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

祝好运!

您可以使用Predicates。 只需获取gameObjects并使用谓词检查它们如下:

 public List FindInactiveGameObjects() { GameObject[] all = GameObject.FindObjectsOfType ();//Get all of them in the scene List objs = new List (); foreach(GameObject obj in all) //Create a list { objs.Add(obj); } Predicate inactiveFinder = new Predicate((GameObject go) => {return !go.activeInHierarchy;});//Create the Finder List results = objs.FindAll (inactiveFinder);//And find inactive ones return results; } 

并且不要忘记使用System; 使用System.Collections.Generic;