Unity Hierarchy 窗口第一个节点自定义绘制教程

想要对 Hierarchy 窗口的第一个节点进行自定义绘制,可以使用 Unity 的 GUI 系统在 OnGUI() 函数中手动绘制节点。

步骤如下:

  1. 创建新的 EditorWindow 并打开 Hierarchy 窗口

  2. OnGUI() 函数中获取 Hierarchy 窗口所有节点并遍历。对于第一个节点,使用 Unity 的 GUI 系统手动绘制。

void OnGUI()
{
    // 获取 Hierarchy 窗口中的所有节点
    var items = (IEnumerable<UnityEditor.IMGUI.Controls.TreeViewItem>)typeof(EditorWindow).Assembly
        .GetType("UnityEditor.SceneHierarchyWindow")
        .GetProperty("treeView", BindingFlags.NonPublic | BindingFlags.Instance)
        .GetValue(this, null)
        .GetType()
        .GetMethod("GetRows", BindingFlags.NonPublic | BindingFlags.Instance)
        .Invoke(this, null);

    // 遍历所有节点
    foreach (var item in items)
    {
        // 如果是第一个节点
        if (item.id == 0)
        {
            // 使用 GUI 系统手动绘制节点
            // ...
        }
        else
        {
            // 绘制普通节点
            hierarchyWindowItemOnGUI(item, item.rect, false);
        }
    }
}
  1. 在手动绘制节点时,可以使用 GUILayoutGUI 类的其他函数绘制节点的图标、名称等。也可以使用 GUIStyle 自定义节点的样式。
void OnGUI()
{
    // ...

    // 如果是第一个节点
    if (item.id == 0)
    {
        // 获取节点名称和图标
        string name = 'First Node';
        Texture2D icon = EditorGUIUtility.IconContent('GameObject Icon').image as Texture2D;

        // 使用 GUI 系统手动绘制节点
        Rect rect = item.rect;
        rect.x += EditorGUI.indentWidth;
        rect.width -= EditorGUI.indentWidth;
        GUI.Box(rect, GUIContent.none);
        GUI.DrawTexture(new Rect(rect.x, rect.y, 16, 16), icon);
        GUI.Label(new Rect(rect.x + 20, rect.y, rect.width - 20, rect.height), name);
    }
    else
    {
        // ...
    }
}
  1. 最后记得在 EditorWindow 的 OnEnable() 函数中订阅 SceneHierarchyWindowRepaint 事件,以便在 Hierarchy 窗口重绘时更新节点的显示。
void OnEnable()
{
    // 订阅 SceneHierarchyWindow 的 Repaint 事件
    var hierarchyWindowType = typeof(EditorWindow).Assembly.GetType("UnityEditor.SceneHierarchyWindow");
    var hierarchyWindow = EditorWindow.GetWindow(hierarchyWindowType);
    var repaintMethod = hierarchyWindowType.GetMethod("Repaint");
    var handler = Delegate.CreateDelegate(typeof(Action), this, "Repaint") as Action;
    repaintMethod.Invoke(hierarchyWindow, new object[] { handler });
}

通过以上步骤,你就可以成功自定义 Hierarchy 窗口第一个节点的绘制内容,使其与其他节点不同,并根据需要进行个性化调整。

Unity Hierarchy 窗口第一个节点自定义绘制教程

原文地址: https://www.cveoy.top/t/topic/nVBx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录