Как получить рекурсивные уровни для каждого элемента?

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

public class GetChildsEditorWindow : EditorWindow
{
    public Transform transform;
    int levelsMin = 3, levelsMax = 4;
    static int currentLevel;
    List<Transform> allChildren = new List<Transform>();
    static int oldLevel = 0;
    Vector2 scrollPos;
    public int levelNum = 0;
    public int totalLevels = 0;

    // Add menu named "My Window" to the Window menu
    [MenuItem("Get Childs/Get")]
    static void Init()
    {
        oldLevel = currentLevel;
        // Get existing open window or if none, make a new one:
        GetChildsEditorWindow window = (GetChildsEditorWindow)EditorWindow.GetWindow(typeof(GetChildsEditorWindow), false, "Get Childs");
        window.Show();
    }

    private void OnGUI()
    {
        GUILayout.Space(20);
        transform = EditorGUILayout.ObjectField("Transform to get childs", transform, typeof(Transform), true) as Transform;

        EditorGUI.BeginDisabledGroup(transform == null);
        currentLevel = (int)EditorGUILayout.Slider("Slider", currentLevel, levelsMin, levelsMax);
        EditorGUI.EndDisabledGroup();

        if (allChildren != null && allChildren.Count > 0)
        {
            EditorGUILayout.BeginHorizontal();
            scrollPos =
                EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Width(400), GUILayout.Height(400));
            for (int i = 0; i < allChildren.Count; i++)
            {
                allChildren[i] = EditorGUILayout.ObjectField("Transform " + i.ToString(), allChildren[i], typeof(Transform), true) as Transform;
            }
            EditorGUILayout.EndScrollView();
            EditorGUILayout.EndHorizontal();
        }

        if (oldLevel != currentLevel)
        {
            if (transform != null)
            {
                allChildren = new List<Transform>();
                IterateOverChild(transform, currentLevel, levelsMax);
                oldLevel = currentLevel;
            }
        }

        if(GUILayout.Button("GEt it"))
        {
            IterateOverChild(transform, 1);
            Debug.Log(currentLevel);
        }
    }

    public void IterateOverChild(Transform original, int currentLevel, int maxLevel)
    {
        if (currentLevel > maxLevel) return;
        for (var i = 0; i < original.childCount; i++)
        {
            Debug.Log($"{original.GetChild(i)}");
            allChildren.Add(original.GetChild(i));
            IterateOverChild(original.GetChild(i), currentLevel + 1, maxLevel);
        }
    }

    public void IterateOverChild(Transform original, int currentLevel)
    {
        for (var i = 0; i < original.childCount; i++)
        {
            Debug.Log($"{original.GetChild(i)}");
            allChildren.Add(original.GetChild(i));
            IterateOverChild(original.GetChild(i), currentLevel + 1);            
        }
    }
}

Я хочу автоматически получить всю глубину уровня для каждого объекта и отобразить его в окне редактора.

Например :

Object 1 is at level 0
Onject 2 is at level 3
Object 3 is at level 0

но у меня есть некоторые проблемы:

В коде теперь второй метод IterateOverChild отображает в конце всего 3 уровня, но есть 4 уровня. и как отображать каждый объект на каком уровне он находится?

На снимке экрана красные стрелки соответствуют уровню 1, зеленые стрелки — уровню 2, желтые — уровню 3, а синие — уровню 4:

levels

Я вижу два GameObject на уровне 1 GameObject и GameObject (1), затем 2 GameObject на уровне 2 и два объекта на уровне 3 и последний на уровне 4. Вот как я вижу логику уровней.

Я хочу обновить панель окна редактора пользовательского интерфейса с объектами и каждым объектом, на каком уровне он находится рядом с каждым объектом, чтобы показать номер уровня. (Я дал объектам имена Уровень 1 Уровень 2 Уровень 3 Уровень 4 только для того, чтобы назвать их в соответствии с моей логикой того, как я вижу уровни).

levels

Очень сложно прочитать этот вопрос и понять, о чем вы спрашиваете. Я не могу сказать, хотите ли вы изменить формат своих операторов отладки, или у вас возникли проблемы с заполнением панели пользовательского интерфейса редактора, или если вы хотите выполнить поиск в ширину вместо поиска в глубину. , или что-то другое. Я скажу, что (1) ваши операторы отладки на вашем изображении не генерируются никаким кодом, который вы отправили, и (2) будет сложно смотреть на имена GameObject, если все ваши объекты названы либо GameObject, либо GameObject ( 1).

Chuck 17.05.2022 21:39

@Chuck, чтобы обновить панель пользовательского интерфейса редактора. Я обновил скриншот. Я дал имена объектам и показывал их в панели пользовательского интерфейса окна редактора после нажатия кнопки. я хочу, чтобы в окне редактора рядом с каждым объектом отображался уровень, к которому он принадлежит. я просто дал ему имена уровня 1 уровня 2 уровня 3 уровня 4, как я вижу в своей логике, но я хочу, чтобы код заполнял объекты в окне панели пользовательского интерфейса.

Daniel Lip 17.05.2022 22:03

@Chuck рядом с каждым объектом на панели пользовательского интерфейса окна редактора справа, чтобы добавить поле, которое будет показывать номер уровня, на котором находится объект.

Daniel Lip 17.05.2022 22:05
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как получить уровень любого преобразования?

Этот метод полностью показывает уровень. Просто поместите желаемое преобразование в параметр:

public static int ObjectLevel(Transform current, int level = 0)
{
    if (current.parent) return ObjectLevel(current.parent, ++level);

    return level;
}

Аналогичный метод в строке:

public static int ObjectLevel(Transform current, int level = 0) => current.parent ? ObjectLevel(current.parent, ++level) : level;


Пример...

Вот что показывает уровень всех игровых объектов:

public void Start()
{
    foreach (var _transform in GameObject.FindObjectsOfType<Transform>())
    {
        var level = ObjectLevel(_transform);
        
        _transform.name += ", level: " + level;
    }
}


Результат:

enter image description here

Другие вопросы по теме