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); } }