处理程序,用于在层级视图中的对象或对象组发生更改时发送的消息。
触发此消息的操作包括在当前层级视图中创建对象以及对其进行重命名、重定父级或销毁,以及加载、卸载、重命名或重新排序已加载的场景。请注意,系统不会为响应这些操作而立即发送该消息,而是会在下一次更新编辑器应用程序期间发送。
对已设置 HideFlags.HideInHierarchy 的对象执行的操作不会发送此消息,但更改 Object.hideFlags 则会发送此消息。
OnHierarchyChange() 已添加到 Unity 编辑器。安装完成后,
对象即成为场景和检视面板中的监视对象。OnHierarchyChange() 可观察到以下操作:
将新的游戏对象添加到 Scene 中,或者在 Inspector 中
更改游戏对象的位置。
还可以看到对旋转和缩放所做的类似更改。
An animation showing how the OnHierarchyChange can be used.
另请参阅:EditorApplication.hierarchyChange
以下示例脚本创建了一个 EditorWindow,可在层级视图发生更改时监控对象数量并进行更新。将该数据复制到名为 HierarchyMonitorWindow.cs 的文件中,然后将文件放在名为 Editor 的文件夹中。
using System.Linq; using UnityEditor; using UnityEngine;
class HierarchyMonitorWindow : EditorWindow { [MenuItem("Window/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 = all.Where(obj => (obj.hideFlags & HideFlags.HideInHierarchy) != HideFlags.HideInHierarchy).Count(); }
void OnGUI() { EditorGUILayout.LabelField( string.Format("There are currently {0} GameObjects visible in the hierarchy.", m_NumberVisible) ); } }
另一个简单示例。
// OnHierarchyChange // // Watch Hierarchy and Inspector access. When GameObjects are changed, or new ones // added or deleted this example will be called.
using UnityEngine; using UnityEditor;
public class ExampleClass : EditorWindow { static int count = 0;
[MenuItem("Example/OnHierarchyChange Example")] static void Init() { ExampleClass window = (ExampleClass)GetWindow(typeof(ExampleClass)); window.Show(); }
void OnHierarchyChange() { count += 1; this.Repaint(); }
void OnGUI() { GUI.Label(new Rect(5, 5, 205, 35), "OnHierarchyChange: " + count.ToString()); } }