hierarchyWindowItemOnGUI怎么对第一个节点自定义绘制
要对第一个节点进行自定义绘制,可以使用Unity的GUI系统在OnGUI()函数中手动绘制节点。具体步骤如下:
-
创建一个新的EditorWindow并打开Hierarchy窗口。
-
在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); } } } -
在手动绘制节点时,可以使用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 { // ... } } -
最后记得在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 }); } ``
原文地址: https://www.cveoy.top/t/topic/eEuR 著作权归作者所有。请勿转载和采集!