0


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

目录

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,则应渲染子对象。这适用于创建树或文件夹之类的结构,其中子对象仅在父项展开时显示。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{publicbool showPosition =true;publicstring status ="Select a GameObject";[MenuItem("Examples/Foldout Usage")]staticvoidInit(){UnityEditor.EditorWindow window =GetWindow(typeof(EditorGUIExample));
        window.position =newRect(0,0,150,60);
        window.Show();}voidOnGUI(){
        showPosition = EditorGUI.Foldout(newRect(3,3, position.width -6,15), showPosition, status);if(showPosition)if(Selection.activeTransform){
                Selection.activeTransform.position = EditorGUI.Vector3Field(newRect(3,25, position.width -6,40),"Position", Selection.activeTransform.position);
                status = Selection.activeTransform.name;}if(!Selection.activeTransform){
            status ="Select a GameObject";
            showPosition =false;}}voidOnInspectorUpdate(){Repaint();}}

1

3.2 检查 GUI 更改: BeginChangeCheck 、EndChangeCheck 监听值改变

  • BeginChangeCheck :启动一个新代码块来检查 GUI 更改。
  • EndChangeCheck :结束代码块并检查是否有任何 GUI 更改。
  • 结合使用来创建一个代码块,检查是否只有该代码块中包含的控件的 GUI 状态发生了更改。
  • 此方法不同于 GUI.changed,后者对于 GUI 状态的“任何”更改都返回 true。BeginChangeCheck() 将检查限制为一组特定的控件。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{float sliderValue =0;string labelText ="-";[MenuItem("Window/Example Window")]staticvoidInit(){var example =(EditorGUIExample)EditorWindow.GetWindow(typeof(EditorGUIExample));
        example.Show();}voidOnGUI(){
        EditorGUILayout.LabelField("New value", labelText);

        EditorGUI.BeginChangeCheck();

        sliderValue =  EditorGUI.Slider(newRect(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 通常更可取,因为它提供了一个更加安全的作用域机制
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{[MenuItem("Tool/TestOnGUI")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}bool _foldoutValue;bool _isDisable;string _textField;string _passwordFile;publicvoidOnGUI(){
        _foldoutValue = EditorGUI.Foldout(newRect(0,0,20,20), _foldoutValue,"折叠");if(_foldoutValue){
            _isDisable = EditorGUI.Toggle(newRect(0,20,20,20),"Disable", _isDisable);
            EditorGUI.BeginDisabledGroup(_isDisable);
            _textField = EditorGUI.TextField(newRect(0,40,200,20),"账号:", _textField);
            _passwordFile = EditorGUI.PasswordField(newRect(0,60,200,20),"密码:", _passwordFile);
            EditorGUI.EndDisabledGroup();}}}

2

在这里插入图片描述

3.4 下拉菜单:DropdownButton

  • DropdownButton :创建一个能够对鼠标按下做出反应的按钮,用于显示您自己的下拉菜单内容。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{[MenuItem("Tool/TestOnGUI")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}bool _foldoutValue;publicvoidOnGUI(){
        _foldoutValue = EditorGUI.Foldout(newRect(0,0,20,20), _foldoutValue,"折叠");if(_foldoutValue){if(EditorGUI.DropdownButton(newRect(0,20,200,40),newGUIContent("下拉菜单"), FocusType.Keyboard)){GenericMenu genericMenu =newGenericMenu();
                genericMenu.AddItem(newGUIContent("One"),false,()=>{ Debug.Log("回调函数");});
                genericMenu.AddSeparator(string.Empty);//分割线
                genericMenu.AddItem(newGUIContent("Two"),false,()=>{});
                genericMenu.AddItem(newGUIContent("There"),false,()=>{});
                genericMenu.DropDown(newRect(0,20,20,20));}}}}

3

3.5 超链接:LinkButton

  • LinkButton :超链接按钮。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{[MenuItem("Tool/TestOnGUI")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}publicvoidOnGUI(){if(EditorGUI.LinkButton(newRect(0,0,100,30),"超链接")){
            Application.OpenURL("www.baidu.com");}}}

5

3.6 颜色字段:ColorField

  • ColorField :创建一个用于选择 Color 的字段。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{[MenuItem("Tool/TestOnGUI")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}Color _colorFiled;publicvoidOnGUI(){
        _colorFiled = EditorGUI.ColorField(newRect(0,0,200,20), _colorFiled);}}

6

3.7 边界盒字段:BoundsField 、BoundsIntField

  • BoundsField :创建用于输入 Bounds 的 Center 和 Extents 字段。
  • BoundsIntField :创建用于输入 BoundsInt 的 Position 和 Size 字段。
usingCodice.Client.BaseCommands;usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{[MenuItem("Tool/TestOnGUI")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}Bounds _boundsFiledValue;BoundsInt _boundsIntFiledValue;publicvoidOnGUI(){
        _boundsFiledValue = EditorGUI.BoundsField(newRect(0,0,200,20), _boundsFiledValue);
        _boundsIntFiledValue = EditorGUI.BoundsIntField(newRect(0,50,200,20), _boundsIntFiledValue);}}

7

3.8 动画曲线面板:CurveField

  • CurveField :生成一个用于编辑 AnimationCurve 的字段。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{[MenuItem("Tool/TestOnGUI")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}privateAnimationCurve _animationCurveValue =newAnimationCurve();publicvoidOnGUI(){
        _animationCurveValue = EditorGUI.CurveField(newRect(0,0,200,20), _animationCurveValue);}}

8

3.9 渐变:GradientField

  • GradientField :创建一个用于编辑 Gradient 的字段。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{Gradient gradient =newGradient();[MenuItem("Examples/Gradient Field demo")]staticvoidInit(){EditorWindow window =GetWindow(typeof(EditorGUIExample));
        window.position =newRect(0,0,400,199);
        window.Show();}voidOnGUI(){
        gradient = EditorGUI.GradientField(newRect(3,3, position.width -6,50),"Gradient", gradient);}}

9

3.10 对象选择器:ObjectField

  • ObjectField :创建一个对象字段。您可以通过拖放对象或使用对象选择器选择对象来分配对象。当对象引用作为资源的一部分进行存储时,请确保 allowSceneObjects 参数为 false,因为资源无法存储对场景中对象的引用。如果 ObjectField 是脚本组件的自定义编辑器的一部分,请使用 EditorUtility.IsPersistent() 检查该组件是位于资源还是场景对象中。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{[MenuItem("Tool/ObjectField")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}privateSprite _objectFieldValue;publicvoidOnGUI(){
        _objectFieldValue =(Sprite)EditorGUI.ObjectField(newRect(0,0,50,50), _objectFieldValue,typeof(Sprite),true);}}

10

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

  • DoubleField :生成一个用于输入双精度浮点数的文本字段。
  • DelayedDoubleField :创建一个用于输入双精度浮点数的延迟文本字段。与DoubleField 类似,但在用户按 Enter 键或将焦点从双精度浮点数字段移开之前,不会返回新值。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{double value1 =0F;double value2 =0F;[MenuItem("Tool/DoubleField")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}publicvoidOnGUI(){
        value1 = EditorGUI.DoubleField(newRect(0,0,100,30), value1);
        value2 = EditorGUI.DelayedDoubleField(newRect(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:

usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{Camera[] cameras;[MenuItem("Tool/DoubleField")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}voidOnGUI(){if(GUI.Button(newRect(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(newRect(3,25+45* i, position.width -6,25),
                    cameras[i].name,
                    cameras[i].rect);}}}}

1

usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{Vector2 v2;Vector2Int v2Int;Vector3 v3;Vector3Int v3Int;Vector4 v4Int;[MenuItem("Tool/DoubleField")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}voidOnGUI(){
        v2 = EditorGUI.Vector2Field(newRect(0,0,100,30),"Vector2Field", v2);
        v2Int = EditorGUI.Vector2IntField(newRect(0,40,100,30),"Vector2IntField", v2Int);

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

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

6

3.13 切换框:Toggle、ToggleLeft

  • Toggle :创建一个开关。
  • ToggleLeft :创建一个开关字段,其中开关位于左侧,标签紧随其右。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{bool showClose =true;[MenuItem("Tool/Toggle")]privatestaticvoidOpenGUIExample(){GetWindow<EditorGUIExample>().Show();}voidOnGUI(){
        showClose = EditorGUI.Toggle(newRect(0,5, position.width,20),"Show Close Button",
             showClose);

        showClose = EditorGUI.ToggleLeft(newRect(0,25, position.width,20),"Show Close Button",
           showClose);}}

5

3.14 选择标签:TagField、LayerField

  • TagField :创建一个标签选择字段。
  • LayerField :创建一个层选择字段。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{string selectedTag ="";int selectedLayer =0;[MenuItem("Examples/Field")]staticvoidInit(){EditorWindow window =GetWindow<EditorGUIExample>();
        window.position =newRect(0,0,350,70);
        window.Show();}voidOnGUI(){
        selectedTag = EditorGUI.TagField(newRect(3,3, position.width /2-6,20),"New Tag:",
            selectedTag);
        selectedLayer = EditorGUI.LayerField(newRect(position.width /2+3,3, position.width /2-6,20),"New Layer:",
            selectedLayer);}voidOnInspectorUpdate(){Repaint();}}

10

3.15 滑动条:Slider、MinMaxSlider

  • Slider :创建一个滑动条,用户可以进行拖动以在最小值和最大值之间更改值。
  • MinMaxSlider :创建一个特殊滑动条,用户可利用该滑动条指定最小值和最大值之间的一个范围。
usingUnityEditor;usingUnityEditor.PackageManager;usingUnityEngine;usingUnityEngine.UIElements;publicclassEditorGUIExample:EditorWindow{float scale =1.0f;float minVal =-10;float minLimit =-20;float maxVal =10;float maxLimit =20;[MenuItem("Examples/Slider")]staticvoidInit(){EditorWindow window =GetWindow<EditorGUIExample>();
        window.position =newRect(0,0,350,70);
        window.Show();}voidOnGUI(){
        scale = EditorGUI.Slider(newRect(5,30,150,20), scale,1,100);
       EditorGUI.MinMaxSlider(newRect(0,0, position.width,20),newGUIContent("Random range:"),ref minVal,ref maxVal,
           minLimit, maxLimit);}}

12

3.16 进度条:ProgressBar

  • ProgressBar :创建一个进度条,值的范围为从 0 到 1,其中 0 表示进度条填充了 0%,而 1 表示进度条 100% 完全填充。
usingUnityEditor;usingUnityEditor.PackageManager;usingUnityEngine;usingUnityEngine.UIElements;publicclassEditorGUIExample:EditorWindow{float armor =20;float damage =80;[MenuItem("Examples/ProgressBar")]staticvoidInit(){EditorWindow window =GetWindow<EditorGUIExample>();
        window.position =newRect(0,0,350,70);
        window.Show();}voidOnGUI(){
        armor = EditorGUI.IntSlider(newRect(3,3, position.width -6,15),"Armor", Mathf.RoundToInt(armor),0,100);
        damage = EditorGUI.IntSlider(newRect(3,25, position.width -6,15),"Damage", Mathf.RoundToInt(damage),0,100);

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

13

3.17 帮助框:HelpBox

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

3.18 Inspector标题栏:InspectorTitlebar

  • InspectorTitlebar :创建一个类似于 Inspector 窗口的标题栏。
usingUnityEditor;usingUnityEditor.PackageManager;usingUnityEngine;usingUnityEngine.UIElements;publicclassEditorGUIExample:EditorWindow{bool showing =true;[MenuItem("Examples/InspectorTitlebar")]staticvoidInit(){EditorWindow window =GetWindow<EditorGUIExample>();
        window.position =newRect(0,0,350,70);
        window.Show();}voidOnGUI(){var currObj = Selection.activeTransform;
        showing = EditorGUI.InspectorTitlebar(newRect(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 :创建一个可让用户输入密码的文本字段。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{float FloatField =0;int IntField =0;long LongField =0;float[] numbers =newfloat[]{0,1,2};GUIContent[] contents =newGUIContent[]{newGUIContent("X"),newGUIContent("Y"),newGUIContent("Z")};string note ="Notes:";string PasswordField ="";string objNames ="";[MenuItem("Examples/Slider")]staticvoidInit(){EditorWindow window =GetWindow<EditorGUIExample>();
        window.position =newRect(0,0,350,70);
        window.Show();}voidOnGUI(){
        FloatField = EditorGUI.FloatField(newRect(0,0,200,20),"FloatField:", FloatField);
        IntField = EditorGUI.IntField(newRect(0,20,200,20),"IntField:", IntField);
        LongField = EditorGUI.LongField(newRect(0,40,200,20),"LongField:", LongField);
        EditorGUI.LabelField(newRect(0,60, position.width,20),"LabelField", EditorApplication.timeSinceStartup.ToString());
        EditorGUI.MultiFloatField(newRect(0,100,200, EditorGUIUtility.singleLineHeight),newGUIContent("位置点"), contents, numbers);
        note = EditorGUI.TextArea(newRect(0,150,100,30), note);
        objNames = EditorGUI.TextField(newRect(0,190, position.width -20,20),"TextField:",
            objNames);

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

12

3.20 通用弹出选择字段:Popup

  • Popup :创建一个通用弹出选择字段,以参数形式获取当前所选的索引,并返回用户选择的索引。
usingUnityEditor;usingUnityEditor.PackageManager;usingUnityEngine;usingUnityEngine.UIElements;publicclassEditorGUIExample:EditorWindow{string[] options ={"Rigidbody","Box Collider","Sphere Collider"};int index =0;[MenuItem("Examples/ProgressBar")]staticvoidInit(){EditorWindow window =GetWindow<EditorGUIExample>();
        window.position =newRect(0,0,350,70);
        window.Show();}voidOnGUI(){
        index = EditorGUI.Popup(newRect(0,0, position.width,20),"Component:",
            index,
            options);}}

15

3.21 单选枚举:EnumPopup

  • EnumPopup :创建一个枚举弹出选择字段。
usingUnityEditor;usingUnityEditor.PackageManager;usingUnityEngine;usingUnityEngine.UIElements;publicclassEditorGUIExample:EditorWindow{OPTIONS display = OPTIONS.Position;publicenumOPTIONS{
        Position =0,
        Rotation =1,
        Scale =2,}[MenuItem("Examples/ProgressBar")]staticvoidInit(){EditorWindow window =GetWindow<EditorGUIExample>();
        window.position =newRect(0,0,350,70);
        window.Show();}voidOnGUI(){
        display =(OPTIONS)EditorGUI.EnumPopup(newRect(3,3, position.width -6,15),"Show:",
           display);}}

16

3.22 多选枚举:EnumFlagsField

  • EnumFlagsField :单击时显示一个菜单,其中包含针对枚举类型的每个值的选项。名称为“Nothing”的值 0 选项和名称为“Everything”的值 ~0(即所有位设置)选项始终显示在菜单顶部。值 0 和 ~0 的名称可以通过在枚举类型中定义这些值来覆盖。
usingUnityEditor;usingUnityEngine;publicclassEditorGUIExample:EditorWindow{enumExampleFlagsEnum{
        None =0, 
        A =1<<0,
        B =1<<1,
        AB = A | B, 
        C =1<<2,
        All =~0,}ExampleFlagsEnum m_Flags;[MenuItem("Examples/EnumFlagsField Example")]staticvoidOpenWindow(){GetWindow<EditorGUIExample>().Show();}voidOnGUI(){
        m_Flags =(ExampleFlagsEnum)EditorGUI.EnumFlagsField(newRect(5,5,300,20), m_Flags);}}

2

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

  • IntPopup :创建一个整数弹出选择字段。
  • MaskField :创建一个适用于掩码的字段。
usingUnityEditor;usingUnityEditor.PackageManager;usingUnityEditor.UIElements;usingUnityEngine;usingUnityEngine.UIElements;usingstaticUnity.IO.LowLevel.Unsafe.AsyncReadManagerMetrics;publicclassEditorGUIExample: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")]staticvoidInit(){var window =GetWindow<EditorGUIExample>();
        window.Show();}voidOnGUI(){
        flags = EditorGUI.MaskField(newRect(0,0,300,20),"Player Flags", flags, options);

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

3

标签: unity 编辑器 c#

本文转载自: https://blog.csdn.net/backlighting2015/article/details/135566416
版权归原作者 游戏开发小Y 所有, 如有侵权,请联系我们删除。

“Unity 编辑器篇|(六)编辑器拓展EditorGUI类 (全面总结 | 建议收藏)”的评论:

还没有评论