首页 > 解决方案 > 如何根据层次结构中的场景顺序对循环进行排序以 debug.log 游戏对象?

问题描述

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;

[ExecuteInEditMode]
public class CompareObjects : MonoBehaviour
{
    private GameObject[] allObjects;

    private void Start()
    {
        allObjects = FindObjectsOfType<GameObject>();

        foreach (GameObject go in allObjects)
        {
            Debug.Log(go.name + " >>>>> " + go.scene.name + " >>>>> is active object");
        }
    }
}

现在它从我添加用于测试的第二个场景中的对象开始,然后有时在第一个场景的中间循环对象,然后返回到第二个。

相反,我希望它始终将层次结构中的顶部场景对象和下一个场景循环到底部。

如果层次结构是这样的:

Scene 1
  GameObject t1
Scene 2
  GameObject t2
Scene 3
  GameObject t1

然后首先循环场景 1 的 t1,然后循环场景 3 的 t2 和 t1

标签: c#unity3d

解决方案


using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;

public static class EditorHelpers
{
    [MenuItem("Tools/PrintHierarchy")]
    public static void PrintHierarchy()
    {
        var scenes = Enumerable.Range(0, SceneManager.sceneCount)
            .Select(SceneManager.GetSceneAt)
            .Select(s => $"Scene {s.name}\n{GetSceneHierarchy(s.GetRootGameObjects())}")
            .ToArray();
        Debug.Log(string.Join("\n", scenes));
    }

    private static string GetSceneHierarchy(GameObject[] gameObjects)
    {
        var child = gameObjects.Select(g => GetChildHierarchyRecursively(g.transform)).ToArray();
        return string.Join("\n", child);
    }

    private static string GetChildHierarchyRecursively(Transform parentTransform, string indent = " ")
    {
        var res = indent + parentTransform.name + "\n"
                  + string.Join("\n",
                      Enumerable.Range(0, parentTransform.childCount)
                          .Select(i => GetChildHierarchyRecursively(parentTransform.GetChild(i), indent += " ")));
        return res;
    }
}

推荐阅读