Unity 6.3
0 онлайн 83 гостей 3 в системе
Вход

EditorWindow.OnHierarchyChange()

Описание

Обработчик для сообщения, которое отправляется при изменении объекта или группы объектов в иерархии.

Действия, которые вызывают это сообщение, включают в себя создание, переименование, изменение родительских прав или уничтожение объектов в текущей иерархии, а также загрузку, разгрузку или переименование загруженных сцен. Обратите внимание, что сообщение отправляется не сразу в ответ на эти действия, а во время следующего обновления приложения редактора.

Меры, принимаемые в отношении объектов, HideFlags.HideInHierarchy настройка не приведет к отправке этого сообщения, но изменение Object.hideFlags Уилл.

OnHierarchyChange() добавляется к пункту Unity редактор. Добавление нового GameObject в Scene, или изменения положения GameObject в 2000 году Inspector будет наблюдаться OnHierarchyChange(). Аналогичным образом, изменения в ротации и масштабе будут видны.


Анимация, показывающая, как можно использовать OnHierarchyChange.

Дополнительные ресурсы: EditorApplication.hierarchyChange

Следующий пример скрипта создает EditorWindow который отслеживает количество объектов и обновляет их при изменении иерархии. Скопируйте его в файл под названием HierarchyMonitorWindow.cs и поместите его в папку Editor.

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

class HierarchyMonitorWindow : EditorWindow
{
    [MenuItem("Examples/Hierarchy Monitor")]
    static void CreateWindow()
    {
        EditorWindow.GetWindow<HierarchyMonitorWindow>();
    }

    [SerializeField]
    int m_NumberVisible;

    void OnEnable()
    {
        titleContent.text = "Hierarchy Monitor";
        // Manually call the event handler when the window is first loaded so its contents are up-to-date.
        OnHierarchyChange();
    }

    void OnHierarchyChange()
    {
        var all = Resources.FindObjectsOfTypeAll(typeof(GameObject));
        m_NumberVisible = CountVisibleObjects(all);
        var label = rootVisualElement.Q<Label>();
        if (label != null)
            label.text = $"There are currently {m_NumberVisible} GameObjects visible in the hierarchy.";
    }

    int CountVisibleObjects(Object[] objects)
    {
        int count = 0;
        foreach (var obj in objects)
        {
            var gameObject = obj as GameObject;
            if (gameObject != null && (gameObject.hideFlags & HideFlags.HideInHierarchy) != HideFlags.HideInHierarchy)
            {
                count++;
            }
        }
        return count;
    }

    void CreateGUI()
    {
        var label = new Label($"There are currently {m_NumberVisible} GameObjects visible in the hierarchy.");
        rootVisualElement.Add(label);
    }
}

Еще один простой пример.

using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;

public class OnHierarchyChangeExample : EditorWindow
{
    static int count = 0;

    [MenuItem("Examples/OnHierarchyChange Example")]
    static void Init()
    {
        OnHierarchyChangeExample window = (OnHierarchyChangeExample)GetWindow(typeof(OnHierarchyChangeExample));
        window.Show();
    }

    void OnHierarchyChange()
    {
        count += 1;
    }

    void CreateGUI()
    {
        var label = new Label();
        rootVisualElement.Add(label);

        label.schedule.Execute(() =>
        {
            label.text = $"OnHierarchyChange: {count}";
        }).Every(10);
    }
}