C# 如何在层次结构中循环所有游戏对象,包括禁用对象以及两个场景中的所有子对象?

C# 如何在层次结构中循环所有游戏对象,包括禁用对象以及两个场景中的所有子对象?,c#,unity3d,C#,Unity3d,列出 秒如何循环两个场景中的对象?我希望在场景a和场景b对象之间进行比较,并且能够缩小对具有特定组件的对象的搜索范围,并在编辑器窗口中列出结果:列出场景a中具有组件的对象a和场景b中具有组件的对象b 例如,如果我在搜索栏中键入:空格,BoxCollider 然后,它应该在两个场景中找到包含名称空间并且还连接了BoxCollider或未连接BoxCollider的所有对象 我想知道结果中哪些对象名称空间有boxcollider,哪些没有 例如: FindObjectsOfType(typeof(G

列出

秒如何循环两个场景中的对象?我希望在场景a和场景b对象之间进行比较,并且能够缩小对具有特定组件的对象的搜索范围,并在编辑器窗口中列出结果:列出场景a中具有组件的对象a和场景b中具有组件的对象b

例如,如果我在搜索栏中键入:空格,BoxCollider 然后,它应该在两个场景中找到包含名称空间并且还连接了BoxCollider或未连接BoxCollider的所有对象

我想知道结果中哪些对象名称空间有boxcollider,哪些没有

例如:

FindObjectsOfType(typeof(GameObject))
类似这样的比较

我无法转换的数组

方法
FindObjectsOfType(Type)
返回对象数组,要将这些对象强制转换为列表,可以使用LINQ方法:

FindObjectsOfType(typeof(GameObject))
List A : Space1 BoxCollider -- Scene A
List A : Space2 Empty -- Scene A

List B : Space1 Empty -- Scene B
List B : Space2 BoxCollider -- Scene B
List<GameObject> items = FindObjectsOfType(typeof(GameObject)).OfType<GameObject>.ToList();
List<GameObject> items = GameObject.FindObjectsOfType<GameObject>().ToList();
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;

public static class Searcher
{
    [MenuItem("Tools/PrintSearch")]
    public static void PrintSearch()
    {
        var objectName = "Space";
        var componentType = typeof(BoxCollider);

        var scenes = Enumerable.Range(0, SceneManager.sceneCount)
            .Select(SceneManager.GetSceneAt)
            .ToArray();
        var objectsWithNames = scenes
            .ToDictionary(s => s, s=> GetSceneObjectsWithName(s, objectName.ToLower()));

        var forLog = objectsWithNames
            .SelectMany(pair => pair.Value.Select(child =>
                $"Scene {pair.Key.name}: object name '{child.gameObject.name}' {(child.GetComponent(componentType) != null ? "contains" : "do not contains")} component {componentType.Name}"));

        Debug.Log(string.Join("\n", forLog));
    }

    private static Transform[] GetSceneObjectsWithName(Scene scene, string objectName)
    {
        return scene.GetRootGameObjects()
            .SelectMany(g => GetChildHierarchyRecursively(g.transform))
            .Where(t=>t.gameObject.name.ToLower().Contains(objectName))
            .ToArray();
    }

    private static IEnumerable<Transform> GetChildHierarchyRecursively(Transform parentTransform)
    {
        yield return parentTransform;
        if (parentTransform.childCount > 0)
            yield return parentTransform;
    }
}