UnityEditor Tabs 分页表签

不确定大家是否需要讲解,还是说只要有代码就够了,也没什么人给我留言,所以我就按自己的想法来说了。
首先Tabs表签的需求是普遍的。做表签的方式也有很多,我只说一个我习惯用的吧。如果有大神有更好的方法希望也能留言交流,相互学习。万分感谢。

1 Tabs标签页的实现

首先定义一个枚举,作为状态切换基础逻辑表签

enum ETAB
    {
        State_Config,      //状态配置
        GUI_Style,         //系统GUI
        Unity_Icon,        //系统ICON
    }

定义一个字符串数组,用来显示对应表签的文字描述,当然你也可以用其他各种容器各种对象,比方说Texture数组。

static string[] TAB = new string[] { "状态配置", "系统GUI", "系统ICON" };
GUIContent[] GUIArr = new GUIContent[]{  EditorGUIUtility.IconContent("d_BuildSettings.Switch") ,
                                    EditorGUIUtility.IconContent("d_BuildSettings.PS4") ,
                                    EditorGUIUtility.IconContent("d_BuildSettings.XboxOne") };

下面是分页表签的简单的选中切换状态的逻辑。比较简单就不细说了直接看代码就好了。主要是我也不太会白话。

private void OnGUI()
    {
        GUILayout.BeginHorizontal();
        for (int i = 0; i < TAB.Length; ++i)
        {            
            if (i == (int)m_Tab)
                m_tabStyle = m_tabBtnOnStyle;
            else
                m_tabStyle = m_tabBtnStyle;

            if (GUILayout.Button(TAB[i], m_tabStyle, GUILayout.Width(90)))
                m_Tab = (ETAB)i;
        }
        GUILayout.EndHorizontal();

        GUILayout.Space(5);

        switch (m_Tab)
        {
            case ETAB.State_Config:                
                // todo some gui logic
                break;
            case ETAB.GUI_Style:
                // todo some gui logic
                break;
            case ETAB.Unity_Icon:
                // todo some gui logic
                break;
        }
    }

2 Unity编辑器中的全部系统样式 All GUIStyles in Unity Editor

private void OnGUI()
{
    m_scrollPosition = GUILayout.BeginScrollView(m_scrollPosition);

    foreach (var style in GUI.skin.customStyles)
    {
        GUILayout.Space(5);
        GUILayout.BeginHorizontal("PopupCurveSwatchBackground");
        if (GUILayout.Button(style.name, style, GUILayout.Width(280)))
        {
            EditorGUIUtility.systemCopyBuffer = style.name;
            Debug.LogError(style.name);
        }
        GUILayout.Space(20);
        EditorGUILayout.SelectableLabel(style.name, GUILayout.Width(200));
        GUILayout.EndHorizontal();
    }

    GUILayout.EndScrollView();
}

Unity 编辑器中的系统图标 All Icons in UnityEditor

这一块的话上一帖已经讲过了。这里就不再多赘述了。


private void InitIconList()
{
    if (m_Icons == null || m_Icons.Count == 0)
    {
        m_Icons = new List<UnityEngine.Object>(Resources.FindObjectsOfTypeAll(typeof(Texture)));
        m_Icons.Sort((pA, pB) => System.String.Compare(pA.name, pB.name, System.StringComparison.OrdinalIgnoreCase));           
    }
}
private void OnGUI()
{
    InitIconList();

    GUILayout.BeginHorizontal("HelpBox");
    m_scrollPosition = GUILayout.BeginScrollView(m_scrollPosition);
    if (m_Icons != null)
    {
        for (int i = 0; i < m_Icons.Count; i++)
        {
            if (i % 5 == 0)
            {
                GUILayout.BeginHorizontal("PopupCurveSwatchBackground");
                for (int j = 0; j < 5; j++)
                {
                    if (i+j >= m_Icons.Count)
                        break;
                    var icon = m_Icons[i+j];
                    GUILayout.BeginVertical();
                    if (GUILayout.Button((Texture)icon, GUILayout.Width(100), GUILayout.Height(100)))
                    {
                        m_te.text = icon.name;
                        m_te.SelectAll();
                        m_te.Copy();
                        this.ShowNotification(new GUIContent("Unity 体统不表:" + icon.name + "已经复制到剪切板!"));
                    }
                    GUILayout.BeginHorizontal();
                    GUILayout.Label((i+j).ToString(), GUILayout.Width(20));
                    GUILayout.Label(icon.name, m_iconNameStyle, GUILayout.Width(80));
                    GUILayout.EndHorizontal();
                    GUILayout.EndVertical();
                }
                GUILayout.EndHorizontal();
                GUILayout.Space(15);
            }
        }
    }

    GUILayout.EndScrollView();
}

完整代码

下面是GIF的完整代码,方便需要的人自取。如果发现有bug的话记得给我留言,谢谢了

/********************************************************************
 Copyright (C) 2020 STUPID DOG STUDIO 
 类    名:TabDemo.cs
 创建时间:2021-04-07 19:04:02
 作    者:Birth.Fat 
 描    述:
 版    本:1.0
*********************************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class TabDemo : EditorWindow
{
    Vector2 m_scrollPosition = new Vector2(0, 0);

    List<UnityEngine.Object> m_Icons;

    TextEditor m_te = new TextEditor();

    enum ETAB
    {
        State_Config,      //状态配置
        GUI_Style,         //系统GUI
        Unity_Icon,        //系统ICON
    }
    static string[] TAB = new string[] { "状态配置", "系统GUI", "系统ICON" };
    GUIContent[] GUIArr; 

    ETAB m_Tab = ETAB.State_Config;
    static private Vector2 m_winSize = new Vector2(800, 750);
    GUIStyle m_tabBtnStyle;
    GUIStyle m_tabBtnOnStyle;
    GUIStyle m_textStyle;
    GUIStyle m_labStyle;
    GUIStyle m_tabTextSytel;
    GUIStyle m_tabStyle;
    GUIStyle m_iconNameStyle;
    GUIStyle m_saveBtnStyle;
    GUIStyle m_toggleStyle;
    GUIStyle m_titleStyle;

    [MenuItem("Tools/Tab表签")]
    static void AddWindow()
    {
        Rect wr = new Rect(0, 0, 600, 600);
        TabDemo window = (TabDemo)EditorWindow.GetWindowWithRect(typeof(TabDemo), wr, true, "Unity Tab表签");
        window.Show();
    }

    //------------------------------------------------------
    private void OnGUI()
    {
        InitGUIStyle();
        InitIconTabs();
        GUILayout.Space(5);
        GUILayout.BeginHorizontal();
        //for (int i = 0; i < TAB.Length; ++i)
        for (int i = 0; i < GUIArr.Length; ++i)
        {
            GUILayout.Space(3);

            if (i == (int)m_Tab)
                m_tabStyle = m_tabBtnOnStyle;
            else
                m_tabStyle = m_tabBtnStyle;

            //if (GUILayout.Button(TAB[i], m_tabStyle, GUILayout.Width(90)))
            if (GUILayout.Button(GUIArr[i], m_tabStyle, GUILayout.Width(90)))
            {
                m_Tab = (ETAB)i;
            }
        }
        GUILayout.EndHorizontal();

        GUILayout.Space(5);
        switch (m_Tab)
        {
            case ETAB.State_Config:                
                StateConfig();
                break;
            case ETAB.GUI_Style:
                SystemGUI();
                break;
            case ETAB.Unity_Icon:
                SystemIcon();
                break;
        }
    }

    private void StateConfig()
    {
        GUILayout.BeginVertical("PopupCurveSwatchBackground");
        GUILayout.Space(5);
        GUILayout.Label("青玉案·元夕", m_textStyle, GUILayout.Width(590));
        GUILayout.Space(5);
        GUILayout.Label("【作者】辛弃疾 【朝代】宋", m_titleStyle, GUILayout.Width(590));
        GUILayout.Space(5);
        GUILayout.Label("东风夜放花千树", m_labStyle, GUILayout.Width(590));
        GUILayout.Space(5);
        GUILayout.Label("更吹落、星如雨", m_labStyle, GUILayout.Width(590));
        GUILayout.Space(5);
        GUILayout.Label("宝马雕车香满路", m_labStyle, GUILayout.Width(590));
        GUILayout.Space(5);
        GUILayout.Label("凤箫声动,玉壶光转,一夜鱼龙舞", m_labStyle, GUILayout.Width(590));
        GUILayout.Space(5);
        GUILayout.Label("蛾儿雪柳黄金缕", m_labStyle, GUILayout.Width(590));
        GUILayout.Space(5);
        GUILayout.Label("笑语盈盈暗香去", m_labStyle, GUILayout.Width(590));
        GUILayout.Space(5);
        GUILayout.Label("众里寻他千百度", m_labStyle, GUILayout.Width(590));
        GUILayout.Space(5);
        GUILayout.Label("蓦然回首,那人却在,灯火阑珊处", m_labStyle, GUILayout.Width(590));
        GUILayout.EndVertical();
    }
    private void SystemGUI()
    {
        m_scrollPosition = GUILayout.BeginScrollView(m_scrollPosition);

        foreach (var style in GUI.skin.customStyles)
        {
            GUILayout.Space(5);
            GUILayout.BeginHorizontal("PopupCurveSwatchBackground");
            if (GUILayout.Button(style.name, style, GUILayout.Width(280)))
            {
                EditorGUIUtility.systemCopyBuffer = style.name;
                Debug.LogError(style.name);
            }
            GUILayout.Space(20);
            EditorGUILayout.SelectableLabel(style.name, GUILayout.Width(200));
            GUILayout.EndHorizontal();
        }

        GUILayout.EndScrollView();
    }
    private void SystemIcon()
    {
        InitIconList();

        GUILayout.BeginHorizontal("HelpBox");
        m_scrollPosition = GUILayout.BeginScrollView(m_scrollPosition);
        if (m_Icons != null)
        {
            for (int i = 0; i < m_Icons.Count; i++)
            {
                if (i % 5 == 0)
                {
                    GUILayout.BeginHorizontal("PopupCurveSwatchBackground");
                    for (int j = 0; j < 5; j++)
                    {
                        if (i+j >= m_Icons.Count)
                            break;
                        var icon = m_Icons[i+j];
                        GUILayout.BeginVertical();
                        if (GUILayout.Button((Texture)icon, GUILayout.Width(100), GUILayout.Height(100)))
                        {
                            m_te.text = icon.name;
                            m_te.SelectAll();
                            m_te.Copy();
                            this.ShowNotification(new GUIContent("Unity 体统不表:" + icon.name + "已经复制到剪切板!"));
                        }
                        GUILayout.BeginHorizontal();
                        GUILayout.Label((i+j).ToString(), GUILayout.Width(20));
                        GUILayout.Label(icon.name, m_iconNameStyle, GUILayout.Width(80));
                        GUILayout.EndHorizontal();
                        GUILayout.EndVertical();   
                    }
                    GUILayout.EndHorizontal();
                    GUILayout.Space(15);
                }
            }
        }
        GUILayout.EndScrollView();
    }
    private void InitIconList()
    {
        if (m_Icons == null || m_Icons.Count == 0)
        {
            m_Icons = new List<UnityEngine.Object>(Resources.FindObjectsOfTypeAll(typeof(Texture)));
            m_Icons.Sort((pA, pB) => System.String.Compare(pA.name, pB.name, System.StringComparison.OrdinalIgnoreCase));           
        }
    }


    //------------------------------------------------------
    private void InitIconTabs()
    {
        GUIArr = new GUIContent[]{  EditorGUIUtility.IconContent("d_BuildSettings.Switch") ,
                                    EditorGUIUtility.IconContent("d_BuildSettings.PS4") ,
                                    EditorGUIUtility.IconContent("d_BuildSettings.XboxOne") };
      }
    //------------------------------------------------------
    private void InitGUIStyle()
    {
        if (m_tabTextSytel == null)
        {
            m_tabTextSytel = new GUIStyle("BoldLabel");
        }
        if (m_tabBtnStyle == null)
        {
            m_tabBtnStyle = new GUIStyle("flow node 0");
            m_tabBtnStyle.alignment = TextAnchor.MiddleCenter;
            m_tabBtnStyle.fontStyle = m_tabTextSytel.fontStyle;
            m_tabBtnStyle.fontSize = 18;
            //color = m_tabBtnStyle.normal.textColor;
        }
        if (m_tabBtnOnStyle == null)
        {
            m_tabBtnOnStyle = new GUIStyle("flow node 1 on");
            m_tabBtnOnStyle.alignment = TextAnchor.MiddleCenter;
            m_tabBtnOnStyle.fontStyle = m_tabTextSytel.fontStyle;
            m_tabBtnOnStyle.fontSize = 18;
        }

        if (m_textStyle == null)
        {
            m_textStyle = new GUIStyle("HeaderLabel");
            m_textStyle.fontSize = 20;
            m_textStyle.alignment = TextAnchor.MiddleCenter;
        }
        if(m_labStyle == null)
        {
            m_labStyle = new GUIStyle("CenteredLabel");
            m_labStyle.fontSize = 18;
        }
        if(m_titleStyle == null)
        {
            m_titleStyle = new GUIStyle("AM VuValue");
            m_titleStyle.alignment = TextAnchor.MiddleRight;
            m_titleStyle.fontSize = 15;
        }
        if (m_iconNameStyle == null)
        {
            m_iconNameStyle = new GUIStyle("WarningOverlay");
            m_iconNameStyle.fontSize = 12;
        }
        if (m_toggleStyle == null)
        {
            m_toggleStyle = new GUIStyle("OL ToggleWhite");
        }
        if (m_saveBtnStyle == null)
        {
            m_saveBtnStyle = new GUIStyle("flow node 1");
            m_saveBtnStyle.fontSize = 20;
            m_saveBtnStyle.fixedHeight = 40;
            m_saveBtnStyle.alignment = TextAnchor.MiddleCenter;
        }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容