Unity 编辑器篇|(七)编辑器拓展EditorGUILayout类 (全面总结 | 建议收藏)

1. 前言

  • EditorGUILayout专门用于编辑器界面的GUI类,提供了Unity内置类或结构体的控件函数,比如Color类、Vector3类等定义的控件。
  • 为编辑器在Inspector和EditorWindow中扩展提供了很大的方便。

2. 参数

静态函数 描述
BeginBuildTargetSelectionGrouping 开始构建目标组并返回所选 BuildTargetGroup。
BeginFadeGroup 开始一个可隐藏/显示的组,并且过渡将生成动画。
BeginFoldoutHeaderGroup 创建一个左侧带有折叠箭头的标签。
BeginHorizontal 开始一个水平组并找回其矩形。
BeginScrollView 开始一个自动布局的滚动视图。
BeginToggleGroup 开始一个垂直组,带有可一次性启用或禁用所有控件的开关。
BeginVertical 开始一个垂直组并找回其矩形。
BoundsField 创建用于输入 Bounds 的 Center 和 Extents 字段。
BoundsIntField 创建用于输入 BoundsInt 的 Position 和 Size 字段。
ColorField 创建一个用于选择 Color 的字段。
CurveField 创建一个用于编辑 AnimationCurve 的字段。
DelayedDoubleField 创建一个用于输入双精度浮点数的延迟文本字段。
DelayedFloatField 创建一个用于输入浮点数的延迟文本字段。
DelayedIntField 创建一个用于输入整数的延迟文本字段。
DelayedTextField 创建一个延迟文本字段。
DoubleField 生成一个用于输入双精度值的文本字段。
DropdownButton 创建一个能够对鼠标按下做出反应的按钮,用于显示您自己的下拉菜单内容。
EditorToolbar 创建一个用指定的编辑器工具集合填充的工具栏。
EditorToolbarForTarget 创建一个工具栏,该工具栏用与目标对象的 EditorToolAttribute 匹配的编辑器工具集合来填充。
EndBuildTargetSelectionGrouping 关闭以 BeginBuildTargetSelectionGrouping 开头的组。
EndFadeGroup 关闭由 BeginFadeGroup 开始的组。
EndFoldoutHeaderGroup 关闭以 BeginFoldoutHeaderGroup 开头的组。
EndHorizontal 闭合以 BeginHorizontal 开始的组。
EndScrollView 结束使用 BeginScrollView 调用开始的滚动视图。
EndToggleGroup 关闭由 BeginToggleGroup 开始的组。
EndVertical 闭合以 BeginVertical 开始的组。
EnumFlagsField 单击后,系统会为枚举类型的每个值显示带有选项的菜单。
EnumPopup 创建一个枚举弹出选择字段。
FloatField 生成一个用于输入浮点值的文本字段。
Foldout 创建一个左侧带有折叠箭头的标签。
GetControlRect 获取编辑器控件的矩形。
GradientField 创建一个用于编辑 Gradient 的字段。
HelpBox 创建一个带有发送给用户的消息的帮助框。
InspectorTitlebar 创建一个类似于 Inspector 窗口的标题栏。
IntField 创建一个用于输入整数的文本字段。
IntPopup 创建一个整数弹出选择字段。
IntSlider 创建一个滑动条,用户可以进行拖动以在最小值和最大值之间更改整数值。
LabelField 生成一个标签字段。(用于显示只读信息。)
LayerField 创建一个层选择字段。
LinkButton Make a clickable link label.
LongField 创建一个用于输入长整数的文本字段。
MaskField 创建一个适用于掩码的字段。
MinMaxSlider 创建一个特殊滑动条,用户可利用该滑动条指定最小值和最大值之间的一个范围。
ObjectField 生成一个可接收任何对象类型的字段。
PasswordField 创建一个可让用户输入密码的文本字段。
Popup 创建一个通用弹出选择字段。
PrefixLabel 创建一个显示在特定控件前的标签。
PropertyField 为 SerializedProperty 生成一个字段。
RectField 创建用于输入 Rect 的 X、Y、W 和 H 字段。
RectIntField 创建用于输入 RectInt 的 X、Y、W 和 H 字段。
SelectableLabel 生成一个可选择标签字段。(用于显示可复制粘贴的只读信息。)
Slider 创建一个滑动条,用户可以进行拖动以在最小值和最大值之间更改值。
Space 在上一个控件和下一个控件之间留出一个小空间。
TagField 创建一个标签选择字段。
TextArea 创建一个文本区域。
TextField 创建一个文本字段。
Toggle 创建一个开关。
ToggleLeft 创建一个开关字段,其中开关位于左侧,标签紧随其右。
ToolContextToolbar 使用指定的编辑器工具上下文集合填充工具栏。
ToolContextToolbarForTarget 使用与目标对象的 EditorToolContextAttribute.targetType 匹配的 EditorToolContext
Vector2Field 创建用于输入 Vector2 的 X 和 Y 字段。
Vector2IntField 创建用于输入 Vector2Int 的 X 和 Y 整数字段。
Vector3Field 创建用于输入 Vector3 的 X、Y 和 Z 字段。
Vector3IntField 创建用于输入 Vector3Int 的 X、Y 和 Z 整数字段。
Vector4Field 创建用于输入 Vector4 的 X、Y、Z 和 W 字段。

3. 功能

3.1 折叠菜单: Foldout

  • Foldout:创建一个左侧带有折叠箭头的标签。bool 用户选择的折叠状态。如果为 true,则应渲染子对象。这适用于创建树或文件夹之类的结构,其中子对象仅在父项展开时显示。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    public bool showPosition = true;
    public string status = "Select a GameObject";
    [MenuItem("Examples/Foldout Usage")]
    static void Init()
    {
    
    
        UnityEditor.EditorWindow window = GetWindow(typeof(EditorGUIExample));
        window.position = new Rect(0, 0, 150, 60);
        window.Show();
    }

    void OnGUI()
    {
    
    
        showPosition = EditorGUILayout.Foldout(showPosition, status);
        if (showPosition)
            if (Selection.activeTransform)
            {
    
    
                Selection.activeTransform.position = EditorGUI.Vector3Field(new Rect(3, 25, position.width - 6, 40), "Position", Selection.activeTransform.position);
                status = Selection.activeTransform.name;
            }

        if (!Selection.activeTransform)
        {
    
    
            status = "Select a GameObject";
            showPosition = false;
        }
    }

    void OnInspectorUpdate()
    {
    
    
        Repaint();
    }
}

1

3.2 折叠组: FoldoutGroup

  • 创建一个左侧带有折叠箭头的标签。
  • 这适用于文件夹之类的结构,其中子对象仅在展开父项时显示。此控件不能嵌套在其他 BeginFoldoutHeaderGroup 中。要使用多个折叠,每个方法都必须以 EndFoldoutHeaderGroup 结尾。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    private bool foldOut;

    [MenuItem("Window/BeginFoldoutHeaderGroup")]
    static void Init()
    {
    
    
        var example = (EditorGUIExample)EditorWindow.GetWindow(typeof(EditorGUIExample));
        example.Show();
    }

    void OnGUI()
    {
    
    
        foldOut = EditorGUILayout.BeginFoldoutHeaderGroup(foldOut, "折叠栏组");
        if (foldOut) //只有foldout为true时,才会显示下方内容,相当于“折叠”了。
        {
    
    
            EditorGUILayout.LabelField("这是折叠标签内容");
        }
        EditorGUILayout.EndFoldoutHeaderGroup(); //只不过这种折叠需要成对使用,不然会有BUG
    }
}

3

3.4 下拉菜单:DropdownButton

  • DropdownButton :创建一个能够对鼠标按下做出反应的按钮,用于显示您自己的下拉菜单内容。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    [MenuItem("Tool/TestOnGUI")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }


    bool _foldoutValue;

    public void OnGUI()
    {
    
    
        _foldoutValue = EditorGUI.Foldout(new Rect(0, 0, 20, 20), _foldoutValue, "折叠");
        if (_foldoutValue)
        {
    
    
            if (EditorGUI.DropdownButton(new Rect(0, 20, 200, 40), new GUIContent("下拉菜单"), FocusType.Keyboard))
            {
    
    
                GenericMenu genericMenu = new GenericMenu();
                genericMenu.AddItem(new GUIContent("One"), false, () => {
    
     Debug.Log("回调函数"); });
                genericMenu.AddSeparator(string.Empty);//分割线
                genericMenu.AddItem(new GUIContent("Two"), false, () => {
    
     });
                genericMenu.AddItem(new GUIContent("There"), false, () => {
    
     });
                genericMenu.DropDown(new Rect(0, 20, 20, 20));
            }
        }
    }  
}

3

3.5 超链接:LinkButton

  • LinkButton :超链接按钮。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    [MenuItem("Tool/TestOnGUI")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }


    public void OnGUI()
    {
    
    
        if (EditorGUILayout.LinkButton("超链接"))
        {
    
    
            Application.OpenURL("www.baidu.com");
        }
    }
}

1

3.6 颜色字段:ColorField

  • ColorField :创建一个用于选择 Color 的字段。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    [MenuItem("Tool/TestOnGUI")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }

    Color _colorFiled;
    public void OnGUI()
    {
    
    
        _colorFiled = EditorGUILayout.ColorField(_colorFiled);
    }  
}

6

3.7 边界盒字段:BoundsField 、BoundsIntField

  • BoundsField :创建用于输入 Bounds 的 Center 和 Extents 字段。
  • BoundsIntField :创建用于输入 BoundsInt 的 Position 和 Size 字段。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    [MenuItem("Tool/TestOnGUI")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }

    Bounds _boundsFiledValue;
    BoundsInt _boundsIntFiledValue;
    public void OnGUI()
    {
    
    
         _boundsFiledValue = EditorGUILayout.BoundsField(_boundsFiledValue);
  _boundsIntFiledValue = EditorGUILayout.BoundsIntField(_boundsIntFiledValue);
    } 
}

1

3.8 动画曲线面板:CurveField

  • CurveField :生成一个用于编辑 AnimationCurve 的字段。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    [MenuItem("Tool/TestOnGUI")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }

    private AnimationCurve _animationCurveValue = new AnimationCurve();
    public void OnGUI()
    {
    
    
        _animationCurveValue = EditorGUILayout.CurveField(_animationCurveValue);
    }
}

8

3.9 渐变:GradientField

  • GradientField :创建一个用于编辑 Gradient 的字段。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    Gradient gradient = new Gradient();

    [MenuItem("Examples/Gradient Field demo")]
    static void Init()
    {
    
    
        EditorWindow window = GetWindow(typeof(EditorGUIExample));
        window.position = new Rect(0, 0, 400, 199);
        window.Show();
    }

    void OnGUI()
    {
    
    
         gradient = EditorGUILayout.GradientField("Gradient", gradient);
    }
}

9

3.10 对象选择器:ObjectField

  • ObjectField :创建一个对象字段。您可以通过拖放对象或使用对象选择器选择对象来分配对象。当对象引用作为资源的一部分进行存储时,请确保 allowSceneObjects 参数为 false,因为资源无法存储对场景中对象的引用。如果 ObjectField 是脚本组件的自定义编辑器的一部分,请使用 EditorUtility.IsPersistent() 检查该组件是位于资源还是场景对象中。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    [MenuItem("Tool/ObjectField")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }

    private Sprite _objectFieldValue;
    public void OnGUI()
    {
    
    
        _objectFieldValue = (Sprite)EditorGUILayout.ObjectField(_objectFieldValue, typeof(Sprite), true);
    }
}

1

3.11 双精度浮点数字段:DoubleField、DelayedDoubleField

  • DoubleField :生成一个用于输入双精度浮点数的文本字段。
  • DelayedDoubleField :创建一个用于输入双精度浮点数的延迟文本字段。与DoubleField 类似,但在用户按 Enter 键或将焦点从双精度浮点数字段移开之前,不会返回新值。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    

    double value1 = 0F;
    double value2 = 0F;

    [MenuItem("Tool/DoubleField")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }
    public void OnGUI()
    {
    
    
        value1 = EditorGUILayout.DoubleField(value1);
        value2 = EditorGUILayout.DelayedDoubleField(value2);
    }
}

1

3.12 多维字段:RectField、RectIntField、Vector2Field、Vector2IntField、Vector3Field、Vector3IntField、Vector4Field

  • RectField :创建用于输入 Rect 的 X、Y、W 和 H 字段。
  • RectIntField :创建用于输入 RectInt 的 X、Y、W 和 H 字段。
  • Vector2Field :创建用于输入 Vector2 的 X 和 Y 字段。
  • Vector2IntField :创建用于输入 Vector2Int 的 X 和 Y 整数字段。
  • Vector3Field :创建用于输入 Vector3 的 X、Y 和 Z 字段。
  • Vector3IntField :创建用于输入 Vector3Int 的 X、Y 和 Z 整数字段。
  • Vector4Field :创建用于输入 Vector4 的 X、Y、Z 和 W 字段。

RectField:

using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    

    Camera[] cameras;

    [MenuItem("Tool/DoubleField")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }
    void OnGUI()
    {
    
    
        if (GUI.Button(new Rect(3, 3, position.width - 6, 20), "Update list"))
            cameras = FindObjectsOfType<Camera>();

        if (cameras.Length > 0)
        {
    
    
            for (var i = 0; i < cameras.Length; i++)
            {
    
    
                 cameras[i].rect = EditorGUILayout.RectField(
     cameras[i].name,
     cameras[i].rect);
            }
        }
    }
}

1

using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    Vector2 v2;
    Vector2Int v2Int;
    Vector3 v3;
    Vector3Int v3Int;
    Vector4 v4Int;

    [MenuItem("Tool/DoubleField")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }
    void OnGUI()
    {
    
    
         v2 = EditorGUILayout.Vector2Field("Vector2Field", v2);
  v2Int = EditorGUILayout.Vector2IntField("Vector2IntField", v2Int);

  v3 = EditorGUILayout.Vector2Field("Vector3Field", v3);
  v3Int = EditorGUILayout.Vector3IntField("Vector3IntField", v3Int);

  v4Int = EditorGUILayout.Vector4Field("Vector4Field", v4Int);
    }
}

1

3.13 切换框:Toggle、ToggleLeft

  • Toggle :创建一个开关。
  • ToggleLeft :创建一个开关字段,其中开关位于左侧,标签紧随其右。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    bool showClose = true;

    [MenuItem("Tool/Toggle")]
    private static void OpenGUIExample()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }
    void OnGUI()
    {
    
    
        showClose = EditorGUILayout.Toggle("Show Close Button", showClose);

 showClose = EditorGUILayout.ToggleLeft("Show Close Button", showClose);
    }
}

5

3.14 选择标签:TagField、LayerField

  • TagField :创建一个标签选择字段。
  • LayerField :创建一个层选择字段。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    string selectedTag = "";
    int selectedLayer = 0;

    [MenuItem("Examples/Field")]
    static void Init()
    {
    
    
        EditorWindow window = GetWindow<EditorGUIExample>();
        window.position = new Rect(0, 0, 350, 70);
        window.Show();
    }

    void OnGUI()
    {
    
    
       selectedTag = EditorGUILayout.TagField("TagField:", selectedTag);
 selectedLayer = EditorGUILayout.LayerField("LayerField:", selectedLayer);
    }

    void OnInspectorUpdate()
    {
    
    
        Repaint();
    }
}

1

3.15 滑动条:Slider、MinMaxSlider

  • Slider :创建一个滑动条,用户可以进行拖动以在最小值和最大值之间更改值。
  • MinMaxSlider :创建一个特殊滑动条,用户可利用该滑动条指定最小值和最大值之间的一个范围。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    float scale = 1.0f;

    float minVal = -10;
    float minLimit = -20;
    float maxVal = 10;
    float maxLimit = 20;

    [MenuItem("Examples/Slider")]
    static void Init()
    {
    
    
        EditorWindow window = GetWindow<EditorGUIExample>();
        window.position = new Rect(0, 0, 350, 70);
        window.Show();
    }

    void OnGUI()
    {
    
    
         scale = EditorGUILayout.Slider(scale, 1, 100);
 EditorGUILayout.MinMaxSlider(
     new GUIContent("Random range:"),
     ref minVal, ref maxVal,
     minLimit, maxLimit);
    }
}

1

3.16 间隔:Space

  • Space :在上一个控件和下一个控件之间留出一个小空间。
EditorGUILayout.LabelField("----上面的Label----");
EditorGUILayout.Space(10); //进行10个单位的间隔
EditorGUILayout.LabelField("----下面的Label----");

1

3.17 帮助框:HelpBox

  • HelpBox :创建一个带有发送给用户的消息的帮助框。
EditorGUILayout.HelpBox("一般提示,你应该这样做...", MessageType.Info);
EditorGUILayout.HelpBox("警告提示,你可能需要这样做...", MessageType.Warning);
EditorGUILayout.HelpBox("错误提示,你不能这样做...", MessageType.Error);

在这里插入图片描述

3.18 Inspector标题栏:InspectorTitlebar

  • InspectorTitlebar :创建一个类似于 Inspector 窗口的标题栏。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    bool showing = true;
    [MenuItem("Examples/InspectorTitlebar")]
    static void Init()
    {
    
    
        EditorWindow window = GetWindow<EditorGUIExample>();
        window.position = new Rect(0, 0, 350, 70);
        window.Show();
    }

    void OnGUI()
    {
    
    
        var currObj = Selection.activeTransform;
 showing = EditorGUILayout.InspectorTitlebar(showing, currObj, showing);
    }
}

在这里插入图片描述

3.19 文本:FloatField、IntField、LabelField、LongField、MultiFloatField、MultiIntField、MultiPropertyField、TextArea、TextField、PasswordField

  • FloatField :创建一个用于输入浮点数的文本字段。
  • IntField :创建一个用于输入整数的文本字段。
  • LabelField :创建一个标签字段。(用于显示只读信息。)
  • LongField :创建一个用于输入长整数的文本字段。
  • MultiFloatField :创建一个带有文本字段的多控件,用于在同一行中输入多个浮点值。
  • MultiIntField :创建一个带有文本字段的多控件,用于在同一行中输入多个整数。
  • MultiPropertyField :创建一个在同一行中包含多个属性字段的多控件。
  • TextArea :创建一个文本区域。
  • TextField :创建一个文本字段。
  • PasswordField :创建一个可让用户输入密码的文本字段。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    

    float FloatField = 0;
    int IntField = 0;
    long LongField = 0;
    float[] numbers = new float[] {
    
     0, 1, 2 };
    GUIContent[] contents = new GUIContent[] {
    
    
    new GUIContent ("X"),
    new GUIContent ("Y"),
    new GUIContent ("Z")};

    string note = "Notes:";
    string PasswordField = "";
    string objNames = "";
    [MenuItem("Examples/Slider")]
    static void Init()
    {
    
    
        EditorWindow window = GetWindow<EditorGUIExample>();
        window.position = new Rect(0, 0, 350, 70);
        window.Show();
    }

    void OnGUI()
    {
    
    
        FloatField = EditorGUILayout.FloatField( "FloatField:", FloatField);
 IntField = EditorGUILayout.IntField("IntField:", IntField);
 LongField = EditorGUILayout.LongField("LongField:", LongField);
 EditorGUILayout.LabelField("LabelField", EditorApplication.timeSinceStartup.ToString());
 note = EditorGUILayout.TextArea( note);
 objNames = EditorGUILayout.TextField(
     "TextField:",
     objNames);

 PasswordField = EditorGUILayout.PasswordField(PasswordField);
    }
}

1

3.20 通用弹出选择字段:Popup

  • Popup :创建一个通用弹出选择字段,以参数形式获取当前所选的索引,并返回用户选择的索引。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    string[] options = {
    
     "Rigidbody", "Box Collider", "Sphere Collider" };
    int index = 0;

    [MenuItem("Examples/ProgressBar")]
    static void Init()
    {
    
    
        EditorWindow window = GetWindow<EditorGUIExample>();
        window.position = new Rect(0, 0, 350, 70);
        window.Show();
    }

    void OnGUI()
    {
    
    
        index = EditorGUI.Popup(
            new Rect(0, 0, position.width, 20),
            "Component:",
            index,
            options);
    }
}

15

3.21 单选枚举:EnumPopup

  • EnumPopup :创建一个枚举弹出选择字段。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    OPTIONS display = OPTIONS.Position;
    public enum OPTIONS
    {
    
    
        Position = 0,
        Rotation = 1,
        Scale = 2,
    }

    [MenuItem("Examples/ProgressBar")]
    static void Init()
    {
    
    
        EditorWindow window = GetWindow<EditorGUIExample>();
        window.position = new Rect(0, 0, 350, 70);
        window.Show();
    }

    void OnGUI()
    {
    
    
         display = (OPTIONS)EditorGUILayout.EnumPopup(
    "Show:",
    display);
    }
}

16

3.22 多选枚举:EnumFlagsField

  • EnumFlagsField :单击时显示一个菜单,其中包含针对枚举类型的每个值的选项。名称为“Nothing”的值 0 选项和名称为“Everything”的值 ~0(即所有位设置)选项始终显示在菜单顶部。值 0 和 ~0 的名称可以通过在枚举类型中定义这些值来覆盖。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    enum ExampleFlagsEnum
    {
    
    
        None = 0, 
        A = 1 << 0,
        B = 1 << 1,
        AB = A | B, 
        C = 1 << 2,
        All = ~0, 
    }

    ExampleFlagsEnum m_Flags;

    [MenuItem("Examples/EnumFlagsField Example")]
    static void OpenWindow()
    {
    
    
        GetWindow<EditorGUIExample>().Show();
    }

    void OnGUI()
    {
    
    
      m_Flags = (ExampleFlagsEnum)EditorGUILayout.EnumFlagsField(m_Flags);
    }
}

2

3.23 单选/多选整型:IntPopup、MaskField

  • IntPopup :创建一个整数弹出选择字段。
  • MaskField :创建一个适用于掩码的字段。
using UnityEditor;
using UnityEngine;
public class EditorGUIExample : EditorWindow
{
    
    
     int flags = 0;
  string[] options = {
    
     "CanJump", "CanShoot", "CanSwim" };


  int selectedSize = 1;
  string[] names = {
    
     "Double", "Triple", "Quadruple" };
  int[] sizes = {
    
     2, 3, 4 };

  [MenuItem("Examples/Mask Field Usage")]
  static void Init()
  {
    
    
      var window = GetWindow<EditorGUIExample>();
      window.Show();
  }

  void OnGUI()
  {
    
    
      flags = EditorGUILayout.MaskField("Player Flags", flags, options);

      selectedSize = EditorGUILayout.IntPopup(
         "Size:",
         selectedSize,
         names,
         sizes);
  }
}

1

3.24 工具栏:EditorToolbar

  • EditorToolbar :创建一个用指定的编辑器工具集合填充的工具栏。
EditorGUILayout.EditorToolbar();

3.25 GUILayout派生控件

private Vector2 scrollRoot;
...
EditorGUILayout.BeginHorizontal(); //开始水平布局
//一大堆控件...
EditorGUILayout.EndHorizontal();//结束水平布局

EditorGUILayout.BeginVertical();//开始垂直布局
//一大堆控件...
EditorGUILayout.EndVertical();//结束垂直布局

scrollRoot = EditorGUILayout.BeginScrollView(scrollRoot); //开启滚动视图
//一大堆控件...
EditorGUILayout.EndScrollView(); //结束滚动视图

4 完整演示版

using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    
    
    string PasswordField = "";
    string m_textArea = "";
    float sliders = 0;
    int slidera = 0;
    string BeginToggleGroup = "BeginToggleGroup";
    bool ToggleGroup = false;
    string Textfield = "";
    bool fg = false;
    float sum = 0;
    int count = 0;
    string tag = "aaa";
    int Layerfield = 0;
    string[] pathname = new string[] {
    
     "All", "Asset", "..." };
    float minVal = 1;
    float maxVal = 2;
    float minLimit = -5;
    float maxLimit = 5;
    static Vector3 center = new Vector3(1, 2, 3);
    static Vector3 size1 = new Vector3(1, 2, 3);
    Bounds _bounds = new Bounds(center, size1);
    Color m_color = Color.white;
    AnimationCurve m_curve = AnimationCurve.Linear(0, 0, 10, 10);
    Vector2 size = new Vector2(100, 100);
    int flags = 0;
    string[] options = new string[] {
    
     "CanJump", "CanShoot", "CanSwim", "Canabc", "Canacc" };
    GameObject game;
    bool showFoldout;
    Vector2 m_vector2 = new Vector2();
    Vector3 m_vector3 = new Vector3();
    Vector4 m_vector4 = new Vector4();
    Transform selectedTransform;
    GameObject selectedGameObject;
    bool fold;
    bool fold2;
    [MenuItem("MyWindow/Window")]
    static void window()
    {
    
    
        EditorGUIExample mybianyi = GetWindow<EditorGUIExample>();
        mybianyi.Show();
    }
    private void OnGUI()
    {
    
    

        // GUILayout.Width  控制在窗口中物体所在的宽
        // GUILayout.Height  控制在窗口中物体所在的高
        //它们的返回的类型为GUILayoutOption
        #region GUILayout.Label 提示语句

        GUILayout.Label("我的编译器(My compiler)", GUILayout.Width(50), GUILayout.Height(10)); //提示语句
        #endregion
        #region GUILayout.Button( 按钮
        GUILayout.Label("按钮");
        if (GUILayout.Button("按钮", GUILayout.Width(40), GUILayout.Height(40)))
        {
    
    

        }
        #endregion
        #region GUILayout.TextField 文本
        GUILayout.Label("文本(可以输入)");
        Textfield = GUILayout.TextField(Textfield);//单行
        //参数2 maxLength 最大有效长度
        // Textfield = GUILayout.TextField(Textfield,5);
        #endregion
        #region GUILayout.Space 空行
        //参数为float类型代表空行的距离
        GUILayout.Space(10);
        #endregion
        #region EditorGUILayout.Toggle 开关(跟Toggle一样)
        fg = EditorGUILayout.Toggle("Toggle", fg);//开关
        #endregion
        #region GUILayout.BeginHorizontal 横向
        GUILayout.BeginHorizontal();//可以在里面存放多个如果不规定大小系统会平均分配大小
        GUILayout.Button("按钮");
        Textfield = GUILayout.TextField(Textfield);
        GUILayout.EndHorizontal();//结束语一定要有
        #endregion
        #region GUILayout.BeginVertical 纵向
        GUILayout.BeginVertical();//可以在里面存放多个如果不规定大小系统会平均分配大小
        GUILayout.Button("按钮");
        Textfield = GUILayout.TextField(Textfield);
        GUILayout.EndVertical();//结束语一定要有
        #endregion
        #region  GUILayout.HorizontalSlider(横) GUILayout.VerticalSlider(纵)  Slider(分横纵 上横下纵)
        sum = GUILayout.HorizontalSlider(sum, 0, 10);
        // sum = GUILayout.VerticalSlider(sum, 0, 10);
        GUILayout.Space(20);
        #endregion
        #region EditorGUILayout.Popup  下拉
        count = EditorGUILayout.Popup("下拉:", count, pathname);
        #endregion
        #region GUILayout.BeginScrollView  滑动列表  
        //两个true可以让横纵两条线显示出了
        //两个false可以让横纵两条线不显示出来
        size = GUILayout.BeginScrollView(size, true, true);

        GUILayout.EndScrollView();
        #endregion
        #region EditorGUILayout.BoundsField (边界输入)   EditorGUILayout.ColorField(颜色输入)  EditorGUILayout.CurveField(曲线输入)   输入框
        //BoundsField 边界输入框
        _bounds = EditorGUILayout.BoundsField("BoundsField:", _bounds);
        //ColorField 颜色输入框
        m_color = EditorGUILayout.ColorField("ColorField:", m_color);
        //CurveField 曲线输入框
        m_curve = EditorGUILayout.CurveField("CurveField:", m_curve);
        #endregion
        #region EditorGUILayout.TagField    tag(标签)
        tag = EditorGUILayout.TagField("TagField:", tag);

        #endregion
        #region   EditorGUILayout.LayerField(可以获取所有的Layer)
        //Layerfield 可以获取所有的Layer
        Layerfield = EditorGUILayout.LayerField("LayerField:", Layerfield);

        #endregion
        #region   EditorGUILayout.MaskField (下拉可以多选)
        flags = EditorGUILayout.MaskField("MaskField:", flags, options);
        //Debug.Log(flags);// 除了数组的第一个是1 后面全是2的幂(幂为对应的下标)   如果多选它们会相加   系统默认会添加Nothing (对应的值0) 和Everything(-1)
        #endregion
        #region EditorGUILayout.ObjectField(选择物体)
        game = (GameObject)EditorGUILayout.ObjectField(game, typeof(GameObject), true);//typeof(类型) 确定好类型系统会自动帮我找到所有的关于这个类型的物体
        #endregion
        #region  EditorGUILayout.Foldout 折叠
        showFoldout = EditorGUILayout.Foldout(showFoldout, "折叠子物体:");
        if (showFoldout)
        {
    
    
            EditorGUI.indentLevel++;//缩进级别
            EditorGUILayout.LabelField("折叠块内容1");
            EditorGUI.indentLevel++;
            EditorGUILayout.LabelField("折叠块内容2");
            EditorGUI.indentLevel--;
            EditorGUI.indentLevel--;
            EditorGUILayout.LabelField("折叠块内容3");
        }
        #endregion
        #region EditorGUILayout.BeginToggleGroup(开关)
        ToggleGroup = EditorGUILayout.BeginToggleGroup(BeginToggleGroup, ToggleGroup);
        Textfield = GUILayout.TextField(Textfield);
        EditorGUILayout.EndToggleGroup();
        #endregion
        #region  GUILayout.FlexibleSpace(布局之间左右对齐)
        EditorGUILayout.BeginHorizontal();//开始最外层横向布局
        GUILayout.FlexibleSpace();//布局之间左右对齐
        GUILayout.Label("-----------------分割线-----------------");
        GUILayout.FlexibleSpace();//布局之间左右对齐
        EditorGUILayout.EndHorizontal();
        #endregion
        #region  EditorGUILayout.HelpBox(提示语句)
        EditorGUILayout.HelpBox("HelpBox Error:", MessageType.Error);//红色错误号
        EditorGUILayout.HelpBox("HelpBox Info:", MessageType.Info);//白色提示号
        EditorGUILayout.HelpBox("HelpBox None:", MessageType.None);//解释号
        EditorGUILayout.HelpBox("HelpBox Warning:", MessageType.Warning);//黄色警告号
        #endregion
        #region EditorGUILayout.Slider(Slider)
        sliders = EditorGUILayout.Slider("Slider:", sliders, 0, 10);
        #endregion
        #region  EditorGUILayout.TextArea(text 自适应高)
        m_textArea = EditorGUILayout.TextArea(m_textArea);//可以多行
        #endregion
        #region GUILayout.PasswordField(可以改变成对应的符号)
        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("密码text", GUILayout.Width(60));
        PasswordField = GUILayout.PasswordField(PasswordField, '*');//可以改变成对应的符号
        EditorGUILayout.EndHorizontal();
        #endregion
        #region  EditorGUILayout.Vector2Field  EditorGUILayout.Vector3Field  EditorGUILayout.Vector4Field  
        m_vector2 = EditorGUILayout.Vector2Field("Vector2:", m_vector2);
        m_vector3 = EditorGUILayout.Vector3Field("Vector3:", m_vector3);
        m_vector4 = EditorGUILayout.Vector4Field("Vector4:", m_vector4);
        #endregion
        #region EditorGUILayout.SelectableLabel (可以复制粘贴)
        EditorGUILayout.SelectableLabel("SelectableLabel");
        #endregion
        #region  EditorGUILayout.MinMaxSlider (取值范围)
        EditorGUILayout.LabelField("Min Val:", minVal.ToString());
        EditorGUILayout.LabelField("Max Val:", maxVal.ToString());
        EditorGUILayout.MinMaxSlider("MinMaxSlider", ref minVal, ref maxVal, minLimit, maxLimit);
        //现在最小  现在最大 最小长度 最大长度      
        #endregion
        #region   EditorGUILayout.IntSlider(只能是整数)
        slidera = EditorGUILayout.IntSlider("IntSlider:", slidera, 1, 10);
        #endregion
        #region  EditorGUILayout.InspectorTitlebar(将物体返回回来)
        //Transform selectedTransform = Selection.activeGameObject.transform;
        //GameObject selectedGameObject = Selection.activeGameObject;//选择物体(GameObject)
        //fold = EditorGUILayout.InspectorTitlebar(fold, selectedTransform);
        //fold2 = EditorGUILayout.InspectorTitlebar(fold2, selectedGameObject);
        #endregion
    }
}

1

猜你喜欢

转载自blog.csdn.net/backlighting2015/article/details/135570746