代码

基于https://github.com/smkplus/CustomToolbar项目中思路,实现简易的扩展工具栏功能

  1. using System.Reflection;
  2. using UnityEditor;
  3. using UnityEngine;
  4. using System;
  5. #if UNITY_2019_1_OR_NEWER
  6. using UnityEngine.UIElements;
  7. #else
  8. using UnityEngine.Experimental.UIElements;
  9. #endif
  10. /// <summary>
  11. /// 扩展Unity的按钮栏
  12. /// </summary>
  13. [InitializeOnLoad]
  14. public static class CustomUnityToolbar
  15. {
  16. public static Type m_toolbarType = typeof(Editor).Assembly.GetType("UnityEditor.Toolbar");
  17. public static ScriptableObject m_currentToolbar;
  18. static CustomUnityToolbar()
  19. {
  20. EditorApplication.delayCall += OnUpdate;
  21. }
  22. public static void OnUpdate()
  23. {
  24. // Relying on the fact that toolbar is ScriptableObject and gets deleted when layout changes
  25. if(m_currentToolbar == null)
  26. {
  27. // Find toolbar
  28. var toolbars = Resources.FindObjectsOfTypeAll(m_toolbarType);
  29. m_currentToolbar = toolbars.Length > 0 ? (ScriptableObject)toolbars[0] : null;
  30. if(m_currentToolbar != null)
  31. {
  32. var root = m_currentToolbar.GetType().GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance);
  33. var rawRoot = root.GetValue(m_currentToolbar);
  34. var mRoot = rawRoot as VisualElement;
  35. RegisterCallback("ToolbarZoneLeftAlign", GUILeft);
  36. RegisterCallback("ToolbarZoneRightAlign", GUIRight);
  37. void RegisterCallback(string root, Action cb)
  38. {
  39. var toolbarZone = mRoot.Q(root);
  40. var parent = new VisualElement()
  41. {
  42. style = {
  43. flexGrow = 1,
  44. flexDirection = FlexDirection.Row,
  45. }
  46. };
  47. var container = new IMGUIContainer();
  48. container.onGUIHandler += () =>
  49. {
  50. cb?.Invoke();
  51. };
  52. parent.Add(container);
  53. toolbarZone.Add(parent);
  54. }
  55. }
  56. }
  57. }
  58. /// <summary>
  59. /// 绘制左侧的元素
  60. /// </summary>
  61. private static void GUILeft()
  62. {
  63. GUILayout.BeginHorizontal();
  64. if(GUILayout.Button("可扩展"))
  65. { }
  66. GUILayout.EndHorizontal();
  67. }
  68. /// <summary>
  69. /// 绘制右侧的元素
  70. /// </summary>
  71. private static void GUIRight()
  72. {
  73. GUILayout.BeginHorizontal();
  74. if(GUILayout.Button("可扩展"))
  75. { }
  76. GUILayout.EndHorizontal();
  77. }
  78. }

效果

扩展Unity的工具(按钮)栏 - 图1

参考