要对第一个节点进行自定义绘制,可以使用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);
            }
        }
    }
    
  3. 在手动绘制节点时,可以使用GUILayout或GUI类的其他函数绘制节点的图标、名称等。也可以使用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
        {
            // ...
        }
    }
    
  4. 最后记得在EditorWindow的OnEnable()函数中订阅SceneHierarchyWindow的Repaint事件,以便在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 });
    }
    ``
    
hierarchyWindowItemOnGUI怎么对第一个节点自定义绘制

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

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