版本: Unity 6 (6000.0)
语言英语
  • C#

EditorWindow.OnHierarchyChange()

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们会阅读用户提出的每项建议变更,并在适用时进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

当层次结构中的对象或对象组发生更改时发送的消息的处理程序。

触发此消息的操作包括在当前层次结构中创建、重命名、重新设置父级或销毁对象,以及加载、卸载、重命名或重新排序已加载的场景。请注意,此消息不是立即响应这些操作发送的,而是在编辑器应用程序的下一次更新期间发送的。

对设置了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);
    }
}