当层次结构中的对象或对象组发生更改时发送的消息的处理程序。
触发此消息的操作包括在当前层次结构中创建、重命名、重新设置父级或销毁对象,以及加载、卸载、重命名或重新排序已加载的场景。请注意,此消息不是立即响应这些操作发送的,而是在编辑器应用程序的下一次更新期间发送的。
对设置了HideFlags.HideInHierarchy 的对象执行的操作不会导致发送此消息,但更改Object.hideFlags 会导致发送此消息。
将OnHierarchyChange() 添加到 Unity 编辑器。在场景中添加新游戏对象,或更改 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); } }