处理程序,用于在层级视图中的对象或对象组发生更改时发送的消息。
Actions that trigger this message include creating, renaming, reparenting, or destroying objects in the current hierarchy, as well as loading, unloading, renaming, or reordering loaded Scenes. Note that the message is not sent immediately in response to these actions, but rather during the next update of the editor application.
对已设置 HideFlags.HideInHierarchy 的对象执行的操作不会发送此消息,但更改 Object.hideFlags 则会发送此消息。
The OnHierarchyChange() is added to the Unity editor. Once installed
objects are watches in the Scene and inspector. Adding a new GameObject
into the Scene, or changing the position of a GameObject in the Inspector will be
observed by OnHierarchyChange().
Similarly changes to the rotation and scale will be seen.
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()); } }