【问题标题】:How to search for multiple GameObjects with a specific tag in Unity?如何在 Unity 中搜索具有特定标签的多个游戏对象?
【发布时间】:2021-12-27 06:19:32
【问题描述】:

我试图搜索具有特定标签的多个游戏对象,并立即将它们全部设置为活动状态。我似乎无法工作。

void FindObjects(){

GameObject[] object;
object = GameObject.FindObjectsWithTag("Archived");

object[0].setActive(true);

}

【问题讨论】:

  • 我会考虑让您的标签对象实现一个接口,该接口将对象注册/取消注册到主容器。这样,您可以快速简单地使用容器,无需任何搜索过程。

标签: c# unity3d


【解决方案1】:
void FindObjects()
    {
        GameObject[] objects;
        objects = GameObject.FindGameObjectsWithTag("Archived");

        if (objects.Length == 0)
        {
            Debug.Log("No game objects are tagged with 'Archived'");
        }
        else
        {
            for (int i = 0; i < objects.Length; i++)
            {
                objects[i].SetActive(true);
            }
        }
    }

【讨论】:

  • 这行不通。 GameObject.FindGameObjectsWithTag 仅查找活动对象。检查我的答案。
【解决方案2】:

GameObject.FindObjectsWithTag 只找到活动的游戏对象,这意味着你不需要做任何事情来激活它们。

您应该使用Resources.FindObjectsOfTypeAll,它也可以找到非活动的游戏对象。但要注意,因为它还会找到加载的资产,而不仅仅是 GameObjects。像这样的东西可以解决问题:

Transform[] objs = Resources.FindObjectsOfTypeAll<Transform>() as Transform[];
for (int i = 0; i < objs.Length; i++){
if (objs[i].hideFlags == HideFlags.None){
    if (objs[i].gameObject.CompareTag("Archived")){
        objs[i].gameObject.SetActive(true);
    }
}

小细节:如果您遇到性能问题(检查数以千计的对象)。在创建对象时尝试将对象添加到列表,这样您就可以只使用列表而不是搜索对象。

其他一些细节,感谢@derHugo:

请注意,在较新的 Unity 版本中,最后还有 FindObjectsOfType(true),它仅在场景中搜索并包括非活动对象!

【讨论】:

  • 想象一下场景中有 1000 个对象,这可能会停滞几秒钟。
  • 我已经用它处理了上千个对象,到目前为止还没有停顿,但我要对其进行一点修改。
  • 注意! Resources.FindObjectsOfTypeAll 包括 .. resources 所以每个预制件等都会被扫描!请注意,在较新的 Unity 版本中,最后还有 FindObjectsOfType&lt;Transform&gt;(true),它仅在场景中搜索并包含非活动对象!
  • 这可能有效!如果它发生停止,我将添加一个加载屏幕,该屏幕将在搜索开始之前显示。
  • @Mintvbz 我已经编辑了我的答案,derHugo 方式更好。
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多