跳转至

编辑器下的GUI

用法和游戏画面中的GUI差别不会太多。只不过有不少的细节处理

编辑器菜单栏打开--浮动窗口

using UnityEditor;

public class TutorialWindow : EditorWindow
{
    private static TutorialWindow window; //窗口实例对象,必须是一个static

    [MenuItem("MyWindows/TutorialWindow")] //定义菜单栏位置
    public static void OpenWindow() //打开窗口函数,必须是static
    {
        window = GetWindow<TutorialWindow>(false, "TutorialWindow", true); //实例化窗口
        window.Show(); //显示窗口
    }
    /// <summary>
    /// 窗口内显示的GUI面板
    /// </summary>
    private void OnGUI()
    {

    }
}

编辑器-检视面板Inspector

1.Mono代码

public class TutorialMono : MonoBehaviour //基本就是个空的Mono
{
    //实现内容
}

2. Editor代码

  • 设置CustomEditor特性
  • 设置实例目标target
  • OnInspectorGUI函数
    using UnityEditor;
    using UnityEngine;
    
    [CustomEditor(typeof(TutorialMono))] //指定自定义Editor所要绑定的Mono类型,这里就是typeof(TutorialMono)
    public class TutorialMonoInspector : Editor //继承Editor
    {
        private TutorialMono m_target; //在Inspector上显示的实例目标
        /// <summary>
        /// 当对象活跃时(在Inspector中显示时),unity自动调用此函数
        /// </summary>
        private void OnEnable()
        {
            m_target = target as TutorialMono; //绑定target,target官方解释: The object being inspected
        }
        /// <summary>
        /// 重写OnInspectorGUI,之后所有的GUI绘制都在此方法中。
        /// </summary>
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI(); //调用父类方法绘制一次GUI,TutorialMono中原本的可序列化数据等会在这里绘制一次。
            //如果不调用父类方法,则这个Mono的Inspector全权由下面代码绘制。
    
            if (GUILayout.Button("这是一个按钮"))   //自定义按钮
            {
                Debug.Log("Hello world");
            }
        }
    }
    

编辑器ToolBar

  • 定义
     [InitializeOnLoad]
     public class ToolbarGUIUtility
     {
    
            static ToolbarGUIUtility()
            {
                ToolbarExtender.RightToolbarGUI.Add(OnRightToolbarGUI);
            }
    }
    
       static void OnRightToolbarGUI()
       {
    
           if (GUILayout.Button(new GUIContent("HelperMonitor", "HelperMonitor"), ToolbarButtonRightStyle, GUILayout.Width(80)))
           {
               HelperMonitor_UIElement.ShowEnergyMonitor_UIElement();
           }
       }
    
  • 展示
            public static readonly List<Action> RightToolbarGUI = new List<Action>();
            private void OnGUI()
            {
    
                if (rightRect.width > 0)
                {
                    GUILayout.BeginArea(rightRect);
                    GUILayout.BeginHorizontal();
                    foreach (var handler in RightToolbarGUI)
                    {
                        handler();
                    }
    
                    GUILayout.EndHorizontal();
                    GUILayout.EndArea();
                }
            }