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

news2025/1/9 1:48:46

目录

  • 1. 前言
  • 2. 参数
  • 3. 功能
    • 3.1 折叠菜单: Foldout
    • 3.2 检查 GUI 更改: BeginChangeCheck 、EndChangeCheck 监听值改变
    • 3.3 可禁用控件:BeginDisabledGroup 、EndDisabledGroup 是否禁用组中的控件
    • 3.4 下拉菜单:DropdownButton
    • 3.5 超链接:LinkButton
    • 3.6 颜色字段:ColorField
    • 3.7 边界盒字段:BoundsField 、BoundsIntField
    • 3.8 动画曲线面板:CurveField
    • 3.9 渐变:GradientField
    • 3.10 对象选择器:ObjectField
    • 3.11 双精度浮点数字段:DoubleField、DelayedDoubleField
    • 3.12 多维字段:RectField、RectIntField、Vector2Field、Vector2IntField、Vector3Field、Vector3IntField、Vector4Field
    • 3.13 切换框:Toggle、ToggleLeft
    • 3.14 选择标签:TagField、LayerField
    • 3.15 滑动条:Slider、MinMaxSlider
    • 3.16 进度条:ProgressBar
    • 3.17 帮助框:HelpBox
    • 3.18 Inspector标题栏:InspectorTitlebar
    • 3.19 文本:FloatField、IntField、LabelField、LongField、MultiFloatField、MultiIntField、MultiPropertyField、TextArea、TextField、PasswordField
    • 3.20 通用弹出选择字段:Popup
    • 3.21 单选枚举:EnumPopup
    • 3.22 多选枚举:EnumFlagsField
    • 3.23 单选/多选整型:IntPopup、MaskField

1. 前言

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

2. 参数

静态函数描述
BeginChangeCheck启动一个新代码块来检查 GUI 更改。
BeginDisabledGroup创建一组可禁用的控件。
BeginFoldoutHeaderGroup创建一个左侧带有折叠箭头的标签。
BeginProperty创建一个属性封装器,可用于使常规 GUI 控件与 SerializedProperty 配合使用。
BoundsField创建用于输入 Bounds 的 Center 和 Extents 字段。
BoundsIntField创建用于输入 BoundsInt 的 Position 和 Size 字段。
ColorField创建一个用于选择 Color 的字段。
CurveField生成一个用于编辑 AnimationCurve 的字段。
DelayedDoubleField创建一个用于输入双精度浮点数的延迟文本字段。
DelayedFloatField创建一个用于输入浮点数的延迟文本字段。
DelayedIntField创建一个用于输入整数的延迟文本字段。
DelayedTextField创建一个延迟文本字段。
DoubleField生成一个用于输入双精度浮点数的文本字段。
DrawPreviewTexture在矩形内绘制纹理。
DrawRect在当前编辑器窗口中的指定位置以指定大小绘制一个着色的矩形。
DrawTextureAlpha在矩形内绘制纹理的 Alpha 通道。
DropdownButton创建一个能够对鼠标按下做出反应的按钮,用于显示您自己的下拉菜单内容。
DropShadowLabel绘制带有投影的标签。
EndChangeCheck结束代码块并检查是否有任何 GUI 更改。
EndDisabledGroup结束由 BeginDisabledGroup 开始的禁用组。
EndFoldoutHeaderGroup关闭以 BeginFoldoutHeaderGroup 开头的组。
EndProperty结束由 BeginProperty 开始的属性封装器。
EnumFlagsField在单击枚举类型的每个值时显示带有选项的菜单。一个名称为“Nothing”的值0选项和一个名称为“Everything”的值0(即所有位设置)选项总是显示在菜单的顶部。值0和0的名称可以通过在enum类型中定义这些值来重写。
EnumPopup创建一个枚举弹出选择字段。
FloatField创建一个用于输入浮点数的文本字段。
FocusTextInControl将键盘焦点移动到指定的文本字段,并开始编辑内容。
Foldout创建一个左侧带有折叠箭头的标签。
GetPropertyHeight获取 PropertyField 控件所需的高度。
GradientField创建一个用于编辑 Gradient 的字段。
HandlePrefixLabel为一些控件创建一个标签。
HelpBox创建一个带有发送给用户的消息的帮助框。
InspectorTitlebar创建一个类似于 Inspector 窗口的标题栏。
IntField创建一个用于输入整数的文本字段。
IntPopup创建一个整数弹出选择字段。
IntSlider创建一个滑动条,用户可以进行拖动以在最小值和最大值之间更改整数值。
LabelField创建一个标签字段。(用于显示只读信息。)
LargeSplitButtonWithDropdownList创建一个大按钮,其中包含常规按钮部分和用于打开下拉菜单的箭头。
LayerField创建一个层选择字段。
LinkButton制作可点击的链接标签。
LongField创建一个用于输入长整数的文本字段。
MaskField创建一个适用于掩码的字段。
MinMaxSlider创建一个特殊滑动条,用户可利用该滑动条指定最小值和最大值之间的一个范围。
MultiFloatField创建一个带有文本字段的多控件,用于在同一行中输入多个浮点值。
MultiIntField创建一个带有文本字段的多控件,用于在同一行中输入多个整数。
MultiPropertyField创建一个在同一行中包含多个属性字段的多控件。
ObjectField创建一个对象字段。您可以通过拖放对象或使用对象选择器选择对象来分配对象。
PasswordField创建一个可让用户输入密码的文本字段。
Popup创建一个通用弹出选择字段。
PrefixLabel创建一个显示在特定控件前的标签。
ProgressBar创建一个进度条。
PropertyField使用此方法在编辑器中针对 SerializedProperty 创建一个字段。
RectField创建用于输入 Rect 的 X、Y、W 和 H 字段。
RectIntField创建用于输入 RectInt 的 X、Y、W 和 H 字段。
SelectableLabel创建一个可选择标签字段。(用于显示可复制粘贴的只读信息。)
Slider创建一个滑动条,用户可以进行拖动以在最小值和最大值之间更改值。
TagField创建一个标签选择字段。
TextArea创建一个文本区域。
TextField创建一个文本字段。
Toggle创建一个开关。
ToggleLeft创建一个开关字段,其中开关位于左侧,标签紧随其右。
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 = EditorGUI.Foldout(new Rect(3, 3, position.width - 6, 15), 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 检查 GUI 更改: BeginChangeCheck 、EndChangeCheck 监听值改变

  • BeginChangeCheck :启动一个新代码块来检查 GUI 更改。
  • EndChangeCheck :结束代码块并检查是否有任何 GUI 更改。
  • 结合使用来创建一个代码块,检查是否只有该代码块中包含的控件的 GUI 状态发生了更改。
  • 此方法不同于 GUI.changed,后者对于 GUI 状态的“任何”更改都返回 true。BeginChangeCheck() 将检查限制为一组特定的控件。
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    float sliderValue = 0;
    string labelText = "-";

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

    void OnGUI()
    {
        EditorGUILayout.LabelField("New value", labelText);

        EditorGUI.BeginChangeCheck();

        sliderValue =  EditorGUI.Slider(new Rect(0, 0, 100, 30), sliderValue, 0, 1);

        if (EditorGUI.EndChangeCheck())
        {
            labelText = sliderValue.ToString();
        }
    }
}

2

3.3 可禁用控件:BeginDisabledGroup 、EndDisabledGroup 是否禁用组中的控件

  • BeginDisabledGroup :创建一组可禁用的控件。
  • EndDisabledGroup :结束由 BeginDisabledGroup 开始的禁用组。
  • 如果 Disabled 设置为 true,则将禁用组内的控件。 如果为 false,则不会更改 Enabled/Disabled 状态。
    注意:与使用 EditorGUI.BeginDisabledGroup()/EditorGUI.EndDisabledGroup() 相比,DisabledScope 通常更可取,因为它提供了一个更加安全的作用域机制
using UnityEditor;
using UnityEngine;

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


    bool _foldoutValue;
    bool _isDisable;
    string _textField;
    string _passwordFile;

    public void OnGUI()
    {
        _foldoutValue = EditorGUI.Foldout(new Rect(0, 0, 20, 20), _foldoutValue, "折叠");
        if (_foldoutValue)
        {
            _isDisable = EditorGUI.Toggle(new Rect(0, 20, 20, 20), "Disable", _isDisable);
            EditorGUI.BeginDisabledGroup(_isDisable);
            _textField = EditorGUI.TextField(new Rect(0, 40, 200, 20), "账号:", _textField);
            _passwordFile = EditorGUI.PasswordField(new Rect(0, 60, 200, 20), "密码:", _passwordFile);
            EditorGUI.EndDisabledGroup();
        }
    }  
}

2

在这里插入图片描述

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 (EditorGUI.LinkButton(new Rect(0, 0, 100, 30), "超链接"))
        {
            Application.OpenURL("www.baidu.com");
        }
    }  
}

5

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 = EditorGUI.ColorField(new Rect(0, 0, 200, 20), _colorFiled);
    }  
}

6

3.7 边界盒字段:BoundsField 、BoundsIntField

  • BoundsField :创建用于输入 Bounds 的 Center 和 Extents 字段。
  • BoundsIntField :创建用于输入 BoundsInt 的 Position 和 Size 字段。
using Codice.Client.BaseCommands;
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 = EditorGUI.BoundsField(new Rect(0, 0, 200, 20), _boundsFiledValue);
        _boundsIntFiledValue = EditorGUI.BoundsIntField(new Rect(0, 50, 200, 20), _boundsIntFiledValue);
    } 
}

7

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 = EditorGUI.CurveField(new Rect(0, 0, 200, 20), _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 = EditorGUI.GradientField(
            new Rect(3, 3, position.width - 6, 50), "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)EditorGUI.ObjectField(new Rect(0, 0, 50, 50), _objectFieldValue, typeof(Sprite), true);
    }
}

10

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 = EditorGUI.DoubleField(new Rect(0, 0, 100, 30), value1);
        value2 = EditorGUI.DelayedDoubleField(new Rect(0, 50, 200, 30), value2);
    }
}

10

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 = EditorGUI.RectField(
                    new Rect(3, 25 + 45 * i, position.width - 6, 25),
                    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 = EditorGUI.Vector2Field(new Rect(0, 0, 100, 30), "Vector2Field", v2);
        v2Int = EditorGUI.Vector2IntField(new Rect(0, 40, 100, 30), "Vector2IntField", v2Int);

        v3 = EditorGUI.Vector2Field(new Rect(0, 80, 100, 30), "Vector3Field", v3);
        v3Int = EditorGUI.Vector3IntField(new Rect(0, 120, 150, 30), "Vector3IntField", v3Int);

        v4Int = EditorGUI.Vector4Field(new Rect(0, 160, 150, 30), "Vector4Field", v4Int);
    }
}

6

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 = EditorGUI.Toggle(new Rect(0, 5, position.width, 20),
             "Show Close Button",
             showClose);

        showClose = EditorGUI.ToggleLeft(new Rect(0, 25, position.width, 20),
           "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 = EditorGUI.TagField(
            new Rect(3, 3, position.width / 2 - 6, 20),
            "New Tag:",
            selectedTag);
        selectedLayer = EditorGUI.LayerField(
            new Rect(position.width / 2 + 3, 3, position.width / 2 - 6, 20),
            "New Layer:",
            selectedLayer);
    }

    void OnInspectorUpdate()
    {
        Repaint();
    }
}

10

3.15 滑动条:Slider、MinMaxSlider

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

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 = EditorGUI.Slider(new Rect(5, 30, 150, 20), scale, 1, 100);
       EditorGUI.MinMaxSlider(
           new Rect(0, 0, position.width, 20),
           new GUIContent("Random range:"),
           ref minVal, ref maxVal,
           minLimit, maxLimit);
    }
}

12

3.16 进度条:ProgressBar

  • ProgressBar :创建一个进度条,值的范围为从 0 到 1,其中 0 表示进度条填充了 0%,而 1 表示进度条 100% 完全填充。
using UnityEditor;
using UnityEditor.PackageManager;
using UnityEngine;
using UnityEngine.UIElements;

public class EditorGUIExample : EditorWindow
{
    float armor = 20;
    float damage = 80;

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

    void OnGUI()
    {
        armor = EditorGUI.IntSlider(new Rect(3, 3, position.width - 6, 15), "Armor", Mathf.RoundToInt(armor), 0, 100);
        damage = EditorGUI.IntSlider(new Rect(3, 25, position.width - 6, 15), "Damage", Mathf.RoundToInt(damage), 0, 100);

        EditorGUI.ProgressBar(new Rect(3, 45, position.width - 6, 20), armor / 100, "Armor");
        EditorGUI.ProgressBar(new Rect(3, 70, position.width - 6, 20), damage / 100, "Damage");
    }
}

13

3.17 帮助框:HelpBox

  • HelpBox :创建一个带有发送给用户的消息的帮助框。
  EditorGUI.HelpBox(new Rect(0, 0, 10, 10), "message", MessageType.Info);

3.18 Inspector标题栏:InspectorTitlebar

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

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 = EditorGUI.InspectorTitlebar(new Rect(0, 0, position.width, 20), 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 = EditorGUI.FloatField(new Rect(0, 0, 200, 20), "FloatField:", FloatField);
        IntField = EditorGUI.IntField(new Rect(0, 20, 200, 20), "IntField:", IntField);
        LongField = EditorGUI.LongField(new Rect(0, 40, 200, 20), "LongField:", LongField);
        EditorGUI.LabelField(new Rect(0, 60, position.width, 20), "LabelField", EditorApplication.timeSinceStartup.ToString());
        EditorGUI.MultiFloatField(
            new Rect(0, 100, 200, EditorGUIUtility.singleLineHeight),
            new GUIContent("位置点"), contents, numbers);
        note = EditorGUI.TextArea(new Rect(0, 150, 100, 30), note);
        objNames = EditorGUI.TextField(new Rect(0, 190, position.width - 20, 20),
            "TextField:",
            objNames);

        PasswordField = EditorGUI.PasswordField(new Rect(0, 210, 100, 20), PasswordField);
    }
}

12

3.20 通用弹出选择字段:Popup

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

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 UnityEditor.PackageManager;
using UnityEngine;
using UnityEngine.UIElements;

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)EditorGUI.EnumPopup(
           new Rect(3, 3, position.width - 6, 15),
           "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)EditorGUI.EnumFlagsField(new Rect(5, 5, 300, 20), m_Flags);
    }
}

2

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

  • IntPopup :创建一个整数弹出选择字段。
  • MaskField :创建一个适用于掩码的字段。
using UnityEditor;
using UnityEditor.PackageManager;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
using static Unity.IO.LowLevel.Unsafe.AsyncReadManagerMetrics;

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 = EditorGUI.MaskField(new Rect(0, 0, 300, 20), "Player Flags", flags, options);

        selectedSize = EditorGUI.IntPopup(
           new Rect(0, 30, position.width - 6, 20),
           "Size:",
           selectedSize,
           names,
           sizes);
    }
}

3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1388654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 查询数据

今天介绍一下 MySQL 数据库使用 SELECT 语句来查询数据。 语法 首先&#xff0c;介绍一下语法。以下为在 MySQL 数据库中查询数据通用的 SELECT 语法&#xff1a; SELECT column1, column2, ... FROM table_name [WHERE condition] [ORDER BY column_name [ASC | DESC]] [LI…

图解基础排序算法(冒泡、插入、选择)(山东大学实验二)

目录 ⚽前言&#xff1a; &#x1f3d0; 冒泡排序&#xff1a; 设定&#xff1a; 分类&#xff1a; 起源&#xff1a; 图解冒泡&#xff1a; 图中绿色&#xff1a; 图中橙色&#xff1a; 整体思路&#xff1a; 交换思路&#xff1a; 核心代码&#xff1a; &#x…

怎么在桌面查看备忘录新的提醒事项?方法教程

在这个信息爆炸的时代&#xff0c;我们每天都面临着无数的任务和提醒。作为一名忙碌的职场人&#xff0c;我经常需要依赖备忘录来记录重要的待办事项&#xff0c;以免遗漏。备忘录&#xff0c;就像我生活中的小助手&#xff0c;帮我记下工作会议、生日提醒、购物清单等等&#…

2.3数据链路层02

2.3 数据链路层 2.3.5 以太网 1、以太网概念 以太网是一种计算机局域网技术。IEEE&#xff08;电气与电子工程师协会&#xff1a;Institute of Electrical and Electronics Engineers&#xff09;组织的IEEE802.3标准制定了以太网的技术标准&#xff0c;它规定了包括物理层的…

matlab行操作快?还是列操作快?

在MATLAB中&#xff0c;通常情况下&#xff0c;对矩阵的列进行操作比对行进行操作更有效率。这是因为MATLAB中内存是按列存储的&#xff0c;因此按列访问数据会更加连续&#xff0c;从而提高访问速度。 一、实例代码 以下是一个简单的测试代码&#xff0c; % 测试矩阵大小 ma…

RK3566RK3568安卓11隐藏状态栏带接口

文章目录 前言一、创建全局变量二、设置应用添加隐藏导航栏按钮三、添加按钮功能四、动态隐藏还有显示功能五、创建系统导航栏广播接口总结 前言 关于Android系统的状态栏&#xff0c;不同的客户有不同的需求: 有些客户需要永久隐藏状态栏&#xff0c;有些客户需要在设置显示中…

鸿蒙 ArkUI - 常用组件和布局

目录 一、组件 1.按钮 2.单选框 3.切换按钮 4.进度条 5.文本 6.文本输入框 二、布局方式 1.线性布局 2.层叠布局 3.弹性布局 4.网格布局 一、组件 ArkUI有丰富的内置组件&#xff0c;包括文本、按钮、图片、进度条、输入框、单选框、多选框等。我们还可以将基础组件…

装饰器模式介绍

目录 一、装饰器模式介绍 1.1 装饰器模式定义 1.2 装饰器模式原理 1.2.1 模式类图 1.2.2 模式角色说明 1.2.3 举例代码 二、装饰器模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 类图说明 2.2.3 具体实现 2.2.3.1 DataLoader类 2.2.3.2 BaseFileDataLoa…

Spring使用注解管理Bean

引入lib包 Spring对Bean管理的常用注解 Component组件(作用在类上) Spring中提供了Component的三个衍生注解:(功能在目前为止是一致的) Controller WEB层 Service 业务层 Repository 持久层 属性注入的注解:(使用注解注入的方式,可以不用提供set方法) Value 用于注入普…

新增PostgreSQL数据库管理功能,1Panel开源面板v1.9.3发布

2024年1月15日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.9.3版本。 在这一版本中&#xff0c;1Panel新增了PostgreSQL数据库管理功能&#xff0c;并且支持设置PHP运行环境扩展模版。此外&#xff0c;我们进行了30多项功能更新和问题修复。1Panel应用…

6个免费好用的 PDF 文件加密软件 [Windows Mac]

加密 PDF 文件使您能够保护它们免受未经授权的访问。当重要信息处于危险之中时&#xff0c;黑客可以访问电子文档。 考虑到它们很容易被黑客入侵&#xff0c;您需要迅速采取行动。避免这种情况的方法之一是使用更适合您需要的 PDF 加密软件。 有很多选项可供选择&#xff0c;…

Linux中DCHP与时间同步

目录 一、DHCP &#xff08;一&#xff09;工作原理 1.获取 2.续约 &#xff08;二&#xff09;分配方式 &#xff08;三&#xff09;服务器配置 1.随机地址分配 2.固定地址分配 二、时间同步 &#xff08;一&#xff09;ntpdate &#xff08;二&#xff09;chrony …

智云谷再获资本市场青睐,完成数千万元A+轮融资

近日&#xff0c;深圳前海智云谷科技有限公司&#xff08;以下简称“智云谷”&#xff09;完成数千万元A轮融资&#xff0c;本轮融资由青松基金独家投资&#xff0c;多维资本担任独家融资财务顾问。本轮融资资金将用于扩大新技术研发投入、智能工厂扩产、加速产品交付&#xff…

openpose环境搭建

编程如画&#xff0c;我是panda&#xff01; 最近学习要用要openpose&#xff0c;配了三天的环境&#xff0c;快疯了&#xff0c;踩了很多坑&#xff0c;在这里和大家分享一下 目录 前言 一、安装openpose 二、运行openpose 三、常见的两个错误 1. No module named pyopen…

深度学习论文解读分享之diffGrad:一种卷积神经网络优化方法

IEEE TNNLS 2020&#xff1a;diffGrad: 一种卷积神经网络优化方法 题目 diffGrad: An Optimization Method for Convolutional Neural Networks 作者 Shiv Ram Dubey , Member, IEEE, Soumendu Chakraborty , Swalpa Kumar Roy , Student Member, IEEE, Snehasis Mukherjee…

leetcode234. 回文链表

题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;hea…

西米支付:到底什么是NFT(数字藏品支付通道)(NFT支付通道)

NFT到底指的是什么呢&#xff1f; 数字藏品的实际意义在于它们打破了传统艺术品的物质形态束缚。数字藏品可以通过虚拟现实和区块链技术进行创作、展示和交易。它们不仅可以满足人们对艺术品的审美需求&#xff0c;还可以成为一种投资和资产保值增值的方式。数字藏品的实际意义…

线控底盘新玩家凶猛!这家企业的ONE-BOX产品正式量产下线

高工智能汽车获悉&#xff0c;12月27日&#xff0c;威肯西科技宣布旗下ONE-BOX线控制动产品--液压解耦制动系统HDBS实现量产下线。该产品将与多个汽车品牌签署量产及定点协议&#xff0c;预计年产量达到60万套。 据了解&#xff0c;作为耀宁科技集团的一级子公司&#xff0c;威…

Javascript 下载方法分享

一、引言 JavaScript是一种广泛使用的编程语言&#xff0c;用于增强网页交互性和动态功能。然而&#xff0c;有时我们需要将JavaScript代码下载并部署到本地服务器或离线环境中。本文将分享一些常用的JavaScript下载方法。 二、直接下载JavaScript文件 手动下载&#xff1a;…

机器学习-决策树

1、什么是决策树&#xff1f; 一种描述概念空间的有效的归纳推理办法。基于决策树的学习方法可以进行不相关的多概念学习&#xff0c;具有简单快捷的优势&#xff0c;已经在各个领域取得广泛应用。 决策树是一种树型结构&#xff0c;其中每个内部结点表示在一个属性上的测试&a…