Как я могу отсортировать цикл к debug.log игровых объектов в соответствии с порядком сцен в иерархии? - PullRequest
0 голосов
/ 07 октября 2019
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

Затем первый цикл t1 сцены 1, затем t2 и t1сцены 3

Ответы [ 2 ]

1 голос
/ 07 октября 2019
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;
    }
}
0 голосов
/ 07 октября 2019

Вы можете заказать массив, используя запрос OrderBy Линка.

Затем вы можете отсортировать их по индексу сцены в настройках вашей сборки, или по имени сцены, или по любому полю / свойству, доступному для класса Scene.

using System.Linq;

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

В качестве альтернативы вы можете сгруппировать ихпо сцене

foreach (var scene_objects in allObjects.GroupBy(x => x.scene))
{
    Debug.Log("Scene: " + scene_objects.Key.name);

    foreach (GameObject go in scene_objects)
    {
        Debug.Log(go.name + " >>>>> " + go.scene.name + " >>>>> is active object");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...