UEDL3-2——枚举、选择、按下按钮

本章代码关键字

1
2
3
4
EditorGUILayout.EnumPopup()            //单选枚举选择,将枚举作为选项一样可以选择,需要配套一个枚举变量
EditorGUILayout.EnumFlagsField() //多选枚举选择,枚举作为多选项,但是枚举需要声明与多选对应的搭配值,否则无法准确转换枚举值,需要配套枚举变量
EditorGUILayout.IntPopup() //整数选择控件,由字符串数组决定选项显示内容,整数数组决定选项的值,选中哪个选项返回哪个值
EditorGUILayout.DropdownButton() //在窗口上绘制一个显示类似于下拉菜单的按下按钮,按下就触发(按住不算)

枚举选择控件

  • 单选枚举选择

    EnumPopup​在窗口上添加了一个选择某个枚举选项的控件,同样,需要配套一个枚举变量来表示选中了哪个枚举,
    需要将该变量传入到方法内,再由该变量接收本帧用户选中的枚举(需要强转为对应的枚举)

    • 参数一:文本标题(可选,可改为GUIContent​​​)
    • 参数二:显示当前选中的枚举变量(传入在外部声明的相应变量)
    • 参数三:GUIStyle​​​(可选)
    • 参数四:GUILayoutOption​​​(使用EditorGUI​​​绘制时可选)
    • 返回值:本帧用户选中的枚举(需要强转为对应的枚举)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    using UnityEditor;
    using UnityEngine;

    public enum E_TestType
    {
    One, Two, Three
    }

    public class Lesson3 : EditorWindow
    {
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3()
    {
    Lesson3 window = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
    window.Show();
    }

    E_TestType type;
    private void OnGUI()
    {
    type = (E_TestType)EditorGUILayout.EnumPopup("枚举选择", type);
    }
    }

    显示效果如下:image

  • 多选枚举选择

    注意:多选枚举进行的是或运算,声明枚举时一定注意其中的赋值,并且一定要有多种情况的搭配值

    下面的枚举声明中One_and_Two​就是搭配值,用来表示One​和Two​同时选中的值:

    1
    2
    3
    4
    5
    6
    7
    public enum E_TestType
    {
    One = 1,
    Two = 2,
    Three = 4,
    One_and_Two = One | Two,
    }

    如果没有搭配值,且依旧使用枚举变量去接收选中哪些选项,则多选选项时,枚举变量接收的实际值是无法在枚举声明的字段中找到对应的
    例如:如果选中了One​和Two​,则方法会返回One = 1​和Two = 2​的或运算结果3​,
    如果在枚举中没有声明3​对应的搭配值One_and_Two​,则返回的结果就不能正常的转换为枚举对应的值,因为没有对应的字段

    如果枚举不声明搭配值,方法返回结果需要强转为int​类型的值,你需要通过int​的值来确认选项哪些被选中,可参考:层级参数的填入

    • 参数一:文本标题(可选,可改为GUIContent​​)
    • 参数二:显示当前选中的枚举变量(传入在外部声明的相应变量)
    • 参数三:GUIStyle​​(可选)
    • 参数四:GUILayoutOption​​(使用EditorGUI​​绘制时可选)
    • 返回值:本帧用户选中的枚举(如果是枚举变量接收,需要强转为对应的枚举)

    EnumFlagsField​在窗口上添加了一个可以多选的枚举选项的控件,同样,需要一个枚举变量来表示选中了哪个枚举,
    需要将该变量传入到方法内,再由该变量接收本帧用户选中的枚举值
    (需要强转为对应的枚举,如果是多选,则需要枚举对应的搭配值,否则无法正常转换为枚举对应的字段)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public enum E_TestType
    {
    One = 1,
    Two = 2,
    Three = 4,
    One_and_Two = One | Two,
    }

    public class Lesson3 : EditorWindow
    {
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3()
    {
    Lesson3 window = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
    window.Show();
    }

    E_TestType type2;
    private void OnGUI()
    {
    type2 = (E_TestType)EditorGUILayout.EnumFlagsField("枚举多选", type2);
    }
    }

    显示效果如下:image

整数选择控件

IntPopup​需要声明两个数组,一个是字符串数组,另一个是int​数组,以及一个int​变量
字符串数组用来作为各个选项显示的内容(可改为GUIContent​),int​数组用来确认各个选项对应的值,int​变量用于记录选中选项的值
其中int​变量需要传入到方法内,并接收方法返回的值

该控件可以通过SerializedProperty​修改MonoBehaviour​脚本对象的属性,使用SerializedProperty​就不需要配套额外变量

  • 参数一:序列化属性SerializedProperty​,可直接修改MonoBehaviour​脚本对象的属性,使用该参数则无需另外配套变量
  • 参数二:文本标题(可选,可改为GUIContent​)
  • 参数三:显示当前选中的选项的值(传入在外部声明的相应变量,使用SerializedProperty​则无需传入该参数)
  • 参数四:各个选项显示的内容(可改为GUIContent​)
  • 参数五:各个选项对应的值
  • 参数六:GUILayoutOption​(使用EditorGUI​绘制时可选)
  • 返回值:本帧选择的选项的值(如果使用序列化属性就不需要接收了)
1
2
3
4
5
6
7
8
9
string[] strs = { "选择123", "选择234", "选择345" };
int[] ints = { 123, 234, 345 };
int num = 0;

private void OnGUI()
{
num = EditorGUILayout.IntPopup("整数单选框", num, strs, ints);
EditorGUILayout.LabelField(num.ToString());
}

显示效果如下:image

按下就触发的按钮控件

DropdownButton​按钮是显示上类似于下拉列表的按钮,即按下就触发,返回当前帧是否被按下的bool值(按住不返回true

  • 参数一:标题(仅限GUIContent​)​

  • 参数二:FocusType​,该枚举时告诉UI系统能够获得键盘焦点,当用户按Tab键时在控件之间进行切换

    • Keyboard​ 该控件可接收键盘焦点
    • Passive​ 该控件不能接收键盘焦点
  • 参数三:GUIStyle​(可选)

  • 参数四:GUILayoutOption​(使用EditorGUI​绘制时可选)

1
2
3
4
5
private void OnGUI()
{
if (EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive))
Debug.Log("按钮按下");
}

显示效果如下:image

按下即显示:image