Unity Hierarchy 窗口第一个节点自定义绘制教程
Unity Hierarchy 窗口第一个节点自定义绘制教程
想要对 Hierarchy 窗口的第一个节点进行自定义绘制,可以使用 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 });
}
通过以上步骤,你就可以成功自定义 Hierarchy 窗口第一个节点的绘制内容,使其与其他节点不同,并根据需要进行个性化调整。
原文地址: https://www.cveoy.top/t/topic/nVBx 著作权归作者所有。请勿转载和采集!