当前位置:   article > 正文

Editor工具开发实用篇:EditorGUI/EditorGUILayout的区别和EditorGUILayout的方法介绍

editorguilayout

目录

一:EditorGUI和EditorGUILayout区别

二:EditorGUILayout

1.EditorGUILayout.BeginFadeGroup(float value);

2.EditorGUILayout.BeginHorizontal  EditorGUILayout.BeginVertical

3.EditorGUILayout.BeginScrollView

4.EditorGUILayout.BeginToggleGroup&&EditorGUILayout.Toggle

5.EditorGUILayout.BoundsField  EditorGUILayout.BoundsIntField  public static Color ColorField   等等等....

6.EditorGUILayout.DropdownButton

7.EditorGUILayout.BeginBuildTargetSelectionGrouping

8.EditorGUILayout.EnumFlagsField

9.EditorGUILayout.EnumPopup

10.EditorGUILayout.Foldout

11.EditorGUILayout.GetControlRect

12.EditorGUILayout.GradientField

13.EditorGUILayout.HelpBox

14.EditorGUILayout.IntSlider||EditorGUILayout.Slider

15.EditorGUILayout.ObjectField

16.EditorGUILayout.PrefixLabel

17.EditorGUILayout.PropertyField

18.EditorGUILayout.SelectableLabel

19.EditorGUILayout.Space();

三.所有代码:


一:EditorGUI和EditorGUILayout区别

官方的api给出的是EditorGUILayout是EditorGUI的自动布局版本

什么意思呢?

如果我们进入到EditorGUI和EditorGUILayout的代码里可以看到EditorGUI类里有的方法 基本在EditorGUILayout类里都有相对应的方法 

区别就是:
EditorGUI类的方法基本上都要传入一个参数Rect包含了位置和大小而EditorGUILayout不需要

这样看的话我们着重了解一下EditorGUILayout

二:EditorGUILayout

常用方法:

1.EditorGUILayout.BeginFadeGroup(float value);

解释: 开始一个可隐藏/显示的组,并且过渡将生成动画。

eg:

  1. private void OnGUI() {
  2.         if(EditorGUILayout.BeginFadeGroup(0)) {
  3.             GUILayout.TextArea("1\n2\n3\n4\n");
  4.         }
  5.         EditorGUILayout.EndFadeGroup();
  6.     }

效果:

修改值为0.5f

  1. private void OnGUI() {
  2.         if(EditorGUILayout.BeginFadeGroup(0.5f)) {
  3.             GUILayout.TextArea("1\n2\n3\n4\n");
  4.         }
  5.         EditorGUILayout.EndFadeGroup();
  6.     }

效果:

 

修改为1

  1. private void OnGUI() {
  2.         if(EditorGUILayout.BeginFadeGroup(1)) {
  3.             GUILayout.TextArea("1\n2\n3\n4\n");
  4.         }
  5.         EditorGUILayout.EndFadeGroup();
  6.     }

效果:

 

2.EditorGUILayout.BeginHorizontal
  EditorGUILayout.BeginVertical

解释:开始一个水平组/垂直组
eg:

  1.         EditorGUILayout.BeginHorizontal();
  2.         GUILayout.Button("H_Btn1");
  3.         GUILayout.Button("H_Btn2");
  4.         EditorGUILayout.EndHorizontal();
  5.         EditorGUILayout.BeginVertical();
  6.         GUILayout.Button("V_Btn1");
  7.         GUILayout.Button("V_Btn1");
  8.         EditorGUILayout.EndVertical();

效果:

3.EditorGUILayout.BeginScrollView

解释:开始一个自动布局的滚动视图。
eg:

  1. scrolpos = EditorGUILayout.BeginScrollView(scrolpos, GUILayout.Width(80), GUILayout.Height(80));
  2.         GUILayout.Label("item1111111111111");
  3.         GUILayout.Label("item2");
  4.         GUILayout.Label("item3");
  5.         GUILayout.Label("item4");
  6.         GUILayout.Label("item5");
  7.         EditorGUILayout.EndScrollView();

效果:

 

4.EditorGUILayout.BeginToggleGroup&&EditorGUILayout.Toggle

BeginToggleGroup  解释:开始一个垂直组,带有可一次性启用或禁用所有控件的开关
Toggle                       解释:创建一个开关
eg:

  1. bool showToggle;
  2.     private void OnGUI() {
  3.         showToggle =  EditorGUILayout.BeginToggleGroup("toggleGroup", showToggle);
  4.         EditorGUILayout.Toggle("toggle1", showToggle);
  5.         EditorGUILayout.Toggle("toggle2", !showToggle);
  6.         EditorGUILayout.EndToggleGroup();
  7.     }

效果:

 

5.EditorGUILayout.BoundsField
  EditorGUILayout.BoundsIntField
  public static Color ColorField   等等等....

unity的api 或者C# api 的一些类型的展示
eg:

  1. Bounds Bounds;
  2.     BoundsInt boundsInt;
  3.     Color color;
  4.     private void OnGUI() {
  5.         EditorGUILayout.BeginVertical();
  6.         Bounds = EditorGUILayout.BoundsField(Bounds);
  7.         boundsInt = EditorGUILayout.BoundsIntField(boundsInt);
  8.         color = EditorGUILayout.ColorField(color);
  9.         EditorGUILayout.EndVertical();
  10.     }

效果:

6.EditorGUILayout.DropdownButton

解释:创建一个能够对鼠标按下做出反应的按钮,用于显示您自己的下拉菜单内容
eg:

  1. private void OnGUI() {
  2. EditorGUILayout.BeginVertical();
  3.         GUIContent dropDown = new GUIContent("菜单");
  4.         if(EditorGUILayout.DropdownButton(dropDown, FocusType.Keyboard)) {
  5.             GenericMenu genericMenu = new GenericMenu();
  6.             genericMenu.AddItem(new GUIContent("文件"), true, Select);
  7.             genericMenu.AddItem(new GUIContent("工具"), false, Select);
  8.             genericMenu.AddSeparator("");
  9.             genericMenu.AddItem(new GUIContent("设置/设置1"), true, Select);
  10.             genericMenu.AddItem(new GUIContent("设置/设置2"), false, Select);
  11.             genericMenu.AddItem(new GUIContent("主题/1"), true, Select);
  12.             genericMenu.AddSeparator("主题/");
  13.             genericMenu.AddItem(new GUIContent("主题/2"), false, Select);
  14.             genericMenu.AddDisabledItem(new GUIContent("不可更改"));
  15.             Rect rect = GUILayoutUtility.GetLastRect();
  16.             genericMenu.DropDown(rect);
  17.         }
  18.         EditorGUILayout.EndVertical();
  19. }
  20.     private void Select() {
  21.         Debug.Log("Select");
  22.     }

效果:

修改:
            Rect rect = GUILayoutUtility.GetLastRect();
            genericMenu.DropDown(rect);

为:
            genericMenu.ShowAsContext();

效果:

拓展:GenericMenu 创建自定义上下文菜单和下拉菜单

变量
allowDuplicateNames
允许菜单具有多个同名的菜单项。


公共函数
AddDisabledItem
向菜单添加已禁用的项。
AddItem
向菜单添加一个项。
AddSeparator
向菜单添加一个分隔符项。
DropDown
在给定屏幕矩形中显示菜单。
GetItemCount
获取菜单中的项数。
ShowAsContext
右键单击时在鼠标下显示菜单。


委托
MenuFunction
回调函数,菜单项选中时调用。
MenuFunction2
带有用户数据的回调函数,菜单项选中时调用。

7.EditorGUILayout.BeginBuildTargetSelectionGrouping

解释:开始构建目标组并返回所选 BuildTargetGroup
eg:

  1. BuildTargetGroup buildTargetGroup = EditorGUILayout.BeginBuildTargetSelectionGrouping();
  2.         if(buildTargetGroup == BuildTargetGroup.Android) {
  3.             GUILayout.Button("A_Btn1");
  4.             GUILayout.Button("A_Btn2");
  5.         } else if(buildTargetGroup == BuildTargetGroup.iOS) {
  6.             GUILayout.Button("I_Btn1");
  7.             GUILayout.Button("I_Btn2");
  8.         } else if(buildTargetGroup == BuildTargetGroup.Standalone) {
  9.             GUILayout.Button("S_Btn1");
  10.             GUILayout.Button("S_Btn2");
  11.         } else if(buildTargetGroup == BuildTargetGroup.WebGL) {
  12.             GUILayout.Button("W_Btn1");
  13.             GUILayout.Button("W_Btn2");
  14.         }
  15.         EditorGUILayout.EndBuildTargetSelectionGrouping();

效果:

 

 

 

8.EditorGUILayout.EnumFlagsField

解释:单击后,系统会为枚举类型每个值显示带有选项的菜单
eg:

  1. public enum CONENUM {
  2.     NONE = 1 << 0,
  3.     NORMAL = 1 << 2,
  4.     SPE = 1 << 3,
  5.     OTHER = 1 << 4,
  6.     ALL = 1 << 5,
  7. }
  8. CONENUM cONENUM;
  9.     private void OnGUI() {
  10.      EditorGUILayout.BeginVertical();
  11.         cONENUM = (CONENUM)EditorGUILayout.EnumFlagsField(cONENUM);
  12.         EditorGUILayout.EndVertical();
  13. }

效果:

 

9.EditorGUILayout.EnumPopup

解释:创建一个枚举弹出选择字段
eg:

  1. public enum CONENUM {
  2.     NONE = 1 << 0,
  3.     NORMAL = 1 << 2,
  4.     SPE = 1 << 3,
  5.     OTHER = 1 << 4,
  6.     ALL = 1 << 5,
  7. }
  8. CONENUM cONENUM;
  9.     private void OnGUI() {
  10.      EditorGUILayout.BeginVertical();
  11.         cONENUM = (CONENUM)EditorGUILayout.EnumPopup("ENUM", cONENUM);
  12.         EditorGUILayout.EndVertical();
  13. }

效果:

10.EditorGUILayout.Foldout

解释:创建一个左侧带有折叠箭头的标签
eg:

  1. bool foldout = false;
  2.     private void OnGUI() {
  3.     EditorGUILayout.BeginVertical();
  4.         foldout = EditorGUILayout.Foldout(foldout, "这个是什么意思,带折叠箭头的标签???");
  5.         if(foldout) {
  6.             GUILayout.Label("来吧展示!");
  7.         }
  8.         EditorGUILayout.EndVertical();
  9. }

效果:

 

 

11.EditorGUILayout.GetControlRect

解释:获取编辑器控件的矩形。
eg:    

  1. Rect controlRect;
  2.     string selectPath;
  3.     private void OnGUI() {
  4.      EditorGUILayout.BeginVertical();
  5.         controlRect = EditorGUILayout.GetControlRect(true, 100);
  6.         selectPath = EditorGUI.TextField(controlRect, selectPath);
  7.         EditorGUILayout.EndVertical();
  8. }

效果:

12.EditorGUILayout.GradientField

解释:创建一个用于编辑 Gradient 的字段。
eg: 

  1. Gradient gradient = new Gradient();
  2.    private void OnGUI() {
  3.         EditorGUILayout.BeginVertical();
  4.         gradient = EditorGUILayout.GradientField(gradient);
  5.         EditorGUILayout.EndVertical();
  6.     }

效果:

 

 

13.EditorGUILayout.HelpBox

解释:创建一个带有发送给用户的消息的帮助框。
eg:

  1. private void OnGUI() {
  2.       EditorGUILayout.BeginVertical();
  3.         EditorGUILayout.HelpBox("一个带有发送给用户消息的帮助框?", MessageType.Error);
  4.         EditorGUILayout.EndVertical();
  5.     }

效果:

 

14.EditorGUILayout.IntSlider||EditorGUILayout.Slider

解释:创建一个滑动条,用户可以进行拖动以在最小值和最大值之间更改整数值。
eg:

  1. int sliderValue = 0;
  2.     private void OnGUI() {
  3.      EditorGUILayout.BeginVertical();
  4.         sliderValue = EditorGUILayout.IntSlider(sliderValue, 0, 100);
  5.         EditorGUILayout.EndVertical();
  6.     }

效果:

 

注: EditorGUILayout.Slider 区别是支持浮点类型

15.EditorGUILayout.ObjectField

解释:生成一个可接收任何对象类型的字段。
eg:

  1. UnityEngine.Object obj;
  2.     private void OnGUI() {
  3.      EditorGUILayout.BeginVertical();
  4.         obj = EditorGUILayout.ObjectField(obj, typeof(UnityEngine.Object), true);
  5.         EditorGUILayout.EndVertical();
  6.     }

效果:

16.EditorGUILayout.PrefixLabel

解释:创建一个显示在特定控件前标签
eg:

  1. Color color;
  2. private void OnGUI() {
  3.         EditorGUILayout.BeginVertical();
  4.         EditorGUILayout.PrefixLabel("Color");
  5.         color = EditorGUILayout.ColorField(color);
  6.         EditorGUILayout.EndVertical();
  7.     }

效果:

 

17.EditorGUILayout.PropertyField

解释:为 SerializedProperty 生成一个字段
eg:

  1. public class TestBtn: MonoBehaviour {
  2.     [HideInInspector]
  3.     public string _name;
  4.     private void OnGUI() {
  5.         EditorGUILayout.BeginHorizontal();
  6.         if(GUILayout.Button(_name)) {
  7.         }
  8.         EditorGUILayout.EndHorizontal();
  9.     }
  10. }
  11. [CustomEditor(typeof(TestBtn))]
  12. public class TestBtnTool : Editor {
  13.     SerializedProperty serializedProperty;
  14.     GUIContent gUIContent;
  15.     private void Awake() {
  16.      //反射拿到_name 赋值给serializedProperty
  17.         if(serializedObject.FindProperty("_name") != null) {
  18.             serializedProperty = serializedObject.FindProperty("_name");
  19.         }
  20.         gUIContent = new GUIContent("L_Name");
  21.     }
  22.     public override void OnInspectorGUI() {
  23.         base.OnInspectorGUI();
  24.         if(serializedProperty != null) {
  25.             EditorGUILayout.PropertyField(serializedProperty, gUIContent);
  26.          //保存 serializedObject  serializedObject是TestBtn 的序列化
  27.             serializedObject.ApplyModifiedProperties();
  28.         }
  29.     }
  30. }

效果:

 

修改L_Name

 

 

18.EditorGUILayout.SelectableLabel

解释:生成一个可选择标签字段。(用于显示可复制粘贴的只读信息。)
eg:

  1. private void OnGUI() {
  2.         EditorGUILayout.BeginVertical();
  3.         EditorGUILayout.SelectableLabel("1");
  4.         EditorGUILayout.SelectableLabel("2");
  5.         EditorGUILayout.SelectableLabel("3");
  6.         EditorGUILayout.EndVertical();
  7. }

修改:

 注:1 2 3 可复制

19.EditorGUILayout.Space();

用在两个控件中间 会有一个空格
eg:      

  1. EditorGUILayout.BeginVertical();
  2.         GUILayout.Button("V_Btn1");
  3.         //EditorGUILayout.Space();
  4.         GUILayout.Button("V_Btn1");
  5.         EditorGUILayout.EndVertical();

效果:

 

使用后:

 

三.所有代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEditor.AnimatedValues;
  5. using UnityEngine;
  6. public class EditorToolWindowOne: EditorWindow {
  7. public static EditorToolWindowOne inst;
  8. float progress;
  9. [MenuItem("EditorTool/OpenWindowOne")]
  10. public static void CreateWindow() {
  11. inst = GetWindow<EditorToolWindowOne>(true, "这是一个浮动窗口");
  12. inst.Show();
  13. }
  14. private void Awake() {
  15. }
  16. Vector2 scrolpos = new Vector2(100, 100);
  17. bool showToggle;
  18. Bounds Bounds;
  19. BoundsInt boundsInt;
  20. Color color;
  21. CONENUM cONENUM;
  22. bool foldout = false;
  23. Rect controlRect;
  24. string selectPath;
  25. Gradient gradient = new Gradient();
  26. int sliderValue = 0;
  27. UnityEngine.Object obj;
  28. private void OnGUI() {
  29. BuildTargetGroup buildTargetGroup = EditorGUILayout.BeginBuildTargetSelectionGrouping();
  30. if(buildTargetGroup == BuildTargetGroup.Android) {
  31. GUILayout.Button("A_Btn1");
  32. GUILayout.Button("A_Btn2");
  33. } else if(buildTargetGroup == BuildTargetGroup.iOS) {
  34. GUILayout.Button("I_Btn1");
  35. GUILayout.Button("I_Btn2");
  36. } else if(buildTargetGroup == BuildTargetGroup.Standalone) {
  37. GUILayout.Button("S_Btn1");
  38. GUILayout.Button("S_Btn2");
  39. } else if(buildTargetGroup == BuildTargetGroup.WebGL) {
  40. GUILayout.Button("W_Btn1");
  41. GUILayout.Button("W_Btn2");
  42. }
  43. EditorGUILayout.EndBuildTargetSelectionGrouping();
  44. if(EditorGUILayout.BeginFadeGroup(1)) {
  45. GUILayout.TextArea("1\n2\n3\n4\n");
  46. }
  47. EditorGUILayout.EndFadeGroup();
  48. EditorGUILayout.BeginVertical();
  49. GUILayout.Button("V_Btn1");
  50. EditorGUILayout.Space();
  51. GUILayout.Button("V_Btn1");
  52. EditorGUILayout.EndVertical();
  53. scrolpos = EditorGUILayout.BeginScrollView(scrolpos, GUILayout.Width(80), GUILayout.Height(80));
  54. GUILayout.Label("item1111111111111");
  55. GUILayout.Label("item2");
  56. GUILayout.Label("item3");
  57. GUILayout.Label("item4");
  58. GUILayout.Label("item5");
  59. EditorGUILayout.EndScrollView();
  60. showToggle = EditorGUILayout.BeginToggleGroup("toggleGroup", showToggle);
  61. EditorGUILayout.Toggle("toggle1", showToggle);
  62. EditorGUILayout.Toggle("toggle2", !showToggle);
  63. EditorGUILayout.EndToggleGroup();
  64. EditorGUILayout.BeginVertical();
  65. Bounds = EditorGUILayout.BoundsField(Bounds);
  66. boundsInt = EditorGUILayout.BoundsIntField(boundsInt);
  67. color = EditorGUILayout.ColorField(color);
  68. GUIContent dropDown = new GUIContent("菜单");
  69. if(EditorGUILayout.DropdownButton(dropDown, FocusType.Keyboard)) {
  70. GenericMenu genericMenu = new GenericMenu();
  71. genericMenu.AddItem(new GUIContent("文件"), true, Select);
  72. genericMenu.AddItem(new GUIContent("工具"), false, Select);
  73. genericMenu.AddSeparator("");
  74. genericMenu.AddItem(new GUIContent("设置/设置1"), true, Select);
  75. genericMenu.AddItem(new GUIContent("设置/设置2"), false, Select);
  76. genericMenu.AddItem(new GUIContent("主题/1"), true, Select);
  77. genericMenu.AddSeparator("主题/");
  78. genericMenu.AddItem(new GUIContent("主题/2"), false, Select);
  79. genericMenu.AddDisabledItem(new GUIContent("不可更改"));
  80. genericMenu.ShowAsContext();
  81. //Rect rect = GUILayoutUtility.GetLastRect();
  82. //genericMenu.DropDown(rect);
  83. }
  84. EditorGUILayout.EndVertical();
  85. EditorGUILayout.BeginVertical();
  86. cONENUM = (CONENUM)EditorGUILayout.EnumFlagsField("enum", cONENUM);
  87. EditorGUILayout.EndVertical();
  88. EditorGUILayout.BeginVertical();
  89. cONENUM = (CONENUM)EditorGUILayout.EnumPopup("ENUM", cONENUM);
  90. EditorGUILayout.EndVertical();
  91. EditorGUILayout.BeginVertical();
  92. foldout = EditorGUILayout.Foldout(foldout, "这个是什么意思,带折叠箭头的标签???");
  93. if(foldout) {
  94. GUILayout.Label("来吧展示!");
  95. }
  96. EditorGUILayout.EndVertical();
  97. EditorGUILayout.BeginVertical();
  98. controlRect = EditorGUILayout.GetControlRect(true, 100);
  99. selectPath = EditorGUI.TextField(controlRect, selectPath);
  100. EditorGUILayout.EndVertical();
  101. EditorGUILayout.BeginVertical();
  102. gradient = EditorGUILayout.GradientField(gradient);
  103. EditorGUILayout.EndVertical();
  104. EditorGUILayout.BeginVertical();
  105. EditorGUILayout.HelpBox("一个带有发送给用户消息的帮助框?", MessageType.Error);
  106. EditorGUILayout.EndVertical();
  107. EditorGUILayout.BeginVertical();
  108. sliderValue = EditorGUILayout.IntSlider(sliderValue, 0, 100);
  109. EditorGUILayout.EndVertical();
  110. EditorGUILayout.BeginVertical();
  111. obj = EditorGUILayout.ObjectField(obj, typeof(UnityEngine.Object), true);
  112. EditorGUILayout.EndVertical();
  113. EditorGUILayout.BeginVertical();
  114. EditorGUILayout.PrefixLabel("Color");
  115. color = EditorGUILayout.ColorField(color);
  116. EditorGUILayout.EndVertical();
  117. EditorGUILayout.BeginVertical();
  118. EditorGUILayout.SelectableLabel("1");
  119. EditorGUILayout.SelectableLabel("2");
  120. EditorGUILayout.SelectableLabel("3");
  121. EditorGUILayout.EndVertical();
  122. }
  123. private void Select() {
  124. Debug.Log("Select");
  125. }
  126. }
  127. public enum CONENUM {
  128. NONE = 1 << 0,
  129. NORMAL = 1 << 2,
  130. SPE = 1 << 3,
  131. OTHER = 1 << 4,
  132. ALL = 1 << 5,
  133. }

 效果:

如果有不对的地方希望能指出来 感激不尽。
另外,不熟悉的代码一定要写一下加深记忆 只用看的记不了太久。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/80342
推荐阅读
  

闽ICP备14008679号