代码
基于https://github.com/smkplus/CustomToolbar项目中思路,实现简易的扩展工具栏功能
using System.Reflection;using UnityEditor;using UnityEngine;using System;#if UNITY_2019_1_OR_NEWERusing UnityEngine.UIElements;#elseusing UnityEngine.Experimental.UIElements;#endif/// <summary>/// 扩展Unity的按钮栏/// </summary>[InitializeOnLoad]public static class CustomUnityToolbar{public static Type m_toolbarType = typeof(Editor).Assembly.GetType("UnityEditor.Toolbar");public static ScriptableObject m_currentToolbar;static CustomUnityToolbar(){EditorApplication.delayCall += OnUpdate;}public static void OnUpdate(){// Relying on the fact that toolbar is ScriptableObject and gets deleted when layout changesif(m_currentToolbar == null){// Find toolbarvar toolbars = Resources.FindObjectsOfTypeAll(m_toolbarType);m_currentToolbar = toolbars.Length > 0 ? (ScriptableObject)toolbars[0] : null;if(m_currentToolbar != null){var root = m_currentToolbar.GetType().GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance);var rawRoot = root.GetValue(m_currentToolbar);var mRoot = rawRoot as VisualElement;RegisterCallback("ToolbarZoneLeftAlign", GUILeft);RegisterCallback("ToolbarZoneRightAlign", GUIRight);void RegisterCallback(string root, Action cb){var toolbarZone = mRoot.Q(root);var parent = new VisualElement(){style = {flexGrow = 1,flexDirection = FlexDirection.Row,}};var container = new IMGUIContainer();container.onGUIHandler += () =>{cb?.Invoke();};parent.Add(container);toolbarZone.Add(parent);}}}}/// <summary>/// 绘制左侧的元素/// </summary>private static void GUILeft(){GUILayout.BeginHorizontal();if(GUILayout.Button("可扩展")){ }GUILayout.EndHorizontal();}/// <summary>/// 绘制右侧的元素/// </summary>private static void GUIRight(){GUILayout.BeginHorizontal();if(GUILayout.Button("可扩展")){ }GUILayout.EndHorizontal();}}
效果


