0


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

目录

1. 前言

  • GUILayout 类是 Unity GUI 的接口,并且具有自动布局功能。使用 IMGUI 系统时,可使用两种不同的模式来排列和组织 UI:固定布局模式和自动布局模式。不必使用一种布局模式来替代另一种布局模式,可在同一OnGUI()函数中同时使用这两种模式。
  • 当有预先设计好的界面可供使用时,采用固定布局比较合理。如果预先不知道需要多少元素,或者不想费心进行每个控件的手动定位,则采用自动布局比较合适。例如,如果要基于保存游戏文件创建大量不同的按钮,但无法准确知道要绘制多少按钮,这种情况下采用自动布局可能会更加合理。具体实际上取决于游戏设计以及所需的界面呈现方式。
  • 使用自动布局时有两个主要的不同之处:- 使用 GUILayout 而不是 GUI- 自动布局控件不需要 Rect() 函数

2. 参数

静态函数描述BeginArea在一个固定的屏幕区域中开始 GUI 控件的 GUILayout 块。BeginHorizontal开始一个水平控件组。BeginScrollView开始一个自动布局的滚动视图。BeginVertical开始一个垂直控件组。Box创建一个自动布局框。Button创建一个单击按钮。EndArea闭合以 BeginArea 开始的 GUILayout 块。EndHorizontal闭合以 BeginHorizontal 开始的组。EndScrollView结束通过 BeginScrollView 调用开始的滚动视图。EndVertical闭合以 BeginVertical 开始的组。ExpandHeight传递给控件以允许或禁止垂直扩展的选项。ExpandWidth传递给控件以允许或禁止水平扩展的选项。FlexibleSpace插入灵活的空白元素。Height传递给控件以使其具有绝对高度的选项。HorizontalScrollbar创建一个水平滚动条。HorizontalSlider用户可以拖动的水平滑动条,用于在最小值和最大值之间更改某值。Label创建一个自动布局标签。MaxHeight传递给控件以指定最大高度的选项。MaxWidth传递给控件以指定最大宽度的选项。MinHeight传递给控件以指定最小高度的选项。MinWidth传递给控件以指定最小宽度的选项。PasswordField创建一个可让用户输入密码的文本字段。RepeatButton创建一个重复按钮。只要用户按住鼠标,该按钮就返回 true。SelectionGrid创建一个选择网格。Space在当前布局组中插入空白元素。TextArea创建一个可供用户编辑字符串的多行文本字段。TextField创建一个可供用户编辑字符串的单行文本字段。Toggle创建一个打开/关闭的开关按钮。Toolbar创建一个工具栏。VerticalScrollbar创建一个垂直滚动条。VerticalSlider用户可以拖动的垂直滑动条,用于在最小值和最大值之间更改某值。Width传递给控件以使其具有绝对宽度的选项。Window创建一个对自身内容进行自动布局的弹出窗口。

3. 功能

3.1 按钮:Button、RepeatButton

  • Button:创建一个单击按钮,有不少重载参数: - text:按钮上显示的文本。- image:要在按钮上显示的纹理。- content:该按钮的文本、图像和工具提示,是GUIContent类。- style:要使用的样式,默认是当前在用的样式。- options:一个布局选项列表,用于指定额外的布局属性,此处传递的值会覆盖style,本质是包含枚举的类。
  • RepeatButton:创建一个重复按钮。只要用户按住鼠标,该按钮就返回 true,参数与Button类似。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{voidOnGUI(){if(GUILayout.Button(" Button")){
            Debug.Log("Clicked Button");}if(GUILayout.RepeatButton(" RepeatButton")){
            Debug.Log("Clicked RepeatButton");}}}

1

3.2 文本:Label、TextArea、TextField、PasswordField

  • Label:创建一个自动布局标签。
  • TextArea:创建一个可供用户编辑字符串的多行文本字段。
  • TextField:创建一个可供用户编辑字符串的单行文本字段。
  • PasswordField :创建一个可让用户输入密码的文本字段。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{publicTexture2D textureToDisplay;publicstring fieldToEdit ="Hello World";publicstring areaToEdit ="Hello World\nI've got 2 lines...";publicstring passwordToEdit ="My Password";voidOnGUI(){//Label
        GUILayout.Label("Hello World!");
        GUILayout.Label(textureToDisplay);//TextField
        fieldToEdit = GUILayout.TextField(fieldToEdit,25);//TextArea
        areaToEdit = GUILayout.TextArea(areaToEdit,200);//PasswordField
        passwordToEdit = GUILayout.PasswordField( passwordToEdit,"*"[0],25);}}

2

3.3 工具栏:Toolbar

  • Toolbar:创建一个工具栏。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{int toolbarInt =0;string[] toolbarStrings ={"Toolbar1","Toolbar2","Toolbar3"};voidOnGUI(){
        toolbarInt = GUILayout.Toolbar(toolbarInt, toolbarStrings);}}

2

3.4 切换框:Toggle

  • Toggle:创建一个打开/关闭的开关按钮。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{bool toggleTxt =false;voidOnGUI(){
        toggleTxt = GUILayout.Toggle(toggleTxt,"A Toggle text");}}

3

3.5 滚动条:HorizontalScroll 、VerticalScroll

  • HorizontalScroll :创建一个水平滚动条。
  • VerticalScroll:创建一个垂直滚动条。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{float vSbarValue;float hSbarValue;voidOnGUI(){
        vSbarValue = GUILayout.VerticalScrollbar(vSbarValue,1.0f,10.0f,0.0f);
        hSbarValue = GUILayout.HorizontalScrollbar(hSbarValue,1.0f,0.0f,10.0f);
        GUILayout.Label("This is a text that makes space");}}

4

3.6 滑条:HorizontalSlider、VerticalSlider

  • HorizontalSlider :用户可以拖动的水平滑动条,用于在最小值和最大值之间更改某值。
  • VerticalSlider:用户可以拖动的垂直滑动条,用于在最小值和最大值之间更改某值。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{float vSliderValue =0.0f;float hSliderValue =0.0f;voidOnGUI(){
        vSliderValue = GUILayout.VerticalSlider(vSliderValue,10.0f,0.0f);
        hSliderValue = GUILayout.HorizontalSlider(hSliderValue,0.0f,10.0f);
        GUILayout.Label("This is a text that makes space");}}

5

3.7 自动布局框:Box

  • Box :创建一个自动布局框。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{Texture tex;voidOnGUI(){if(!tex){
            Debug.LogError("Missing texture, assign a texture in the inspector");}
        GUILayout.Box(tex);
        GUILayout.Box("This is a sized label");}}

6

3.8 布局:BeginHorizontal、EndHorizontal、BeginVertical、EndVertical

  • BeginHorizontal:开始一个水平控件组。
  • EndHorizontal:闭合以 BeginHorizontal 开始的组。
  • BeginVertical:开始一个垂直控件组。
  • EndVertical:闭合以 BeginVertical 开始的组。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{voidOnGUI(){
        GUILayout.BeginHorizontal();
        GUILayout.Button("水平按钮1");
        GUILayout.Button("水平按钮2");
        GUILayout.EndHorizontal();

        GUILayout.BeginVertical();
        GUILayout.Button("垂直按钮1");
        GUILayout.Button("垂直按钮2");
        GUILayout.EndVertical();}}

6

3.9 滑动布局:ScrollView

  • ScrollView方法也分为BeginScrollView和EndScrollView,他需要传入至少一个参数Vector2来记录自己滑动到什么地方了。和其他方法不一样的是,如果不给他加限制条件,他会把全部内容物大小计算出来然后拓展面板长度,也就是没有滑动效果。所以我们需要用一些方法来限制他。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{privateVector2 scrollViewRoot;voidOnGUI(){//如果不加以限制,会导致面板强制拉伸300长度,按钮全部放出来
        scrollViewRoot = GUILayout.BeginScrollView(scrollViewRoot, GUILayout.Width(200), GUILayout.Height(200));
        GUILayout.Button("1", GUILayout.Height(100));
        GUILayout.Button("2", GUILayout.Height(100));
        GUILayout.Button("3", GUILayout.Height(100));
        GUILayout.EndScrollView();}}

7

3.10 空白间隔:Space

  • Space方法在当前布局组中插入空白元素,非常简单,没有任何重载构造函数,只需要传入空白长度就能用了。 因为太简单了就不演示了,一般它是拿来美观或者搭配Area使用的。当然,如果它在水平的元素中,自身也会变成水平的空白块。

3.11 浮动窗口:Window

  • Window:创建一个对自身内容进行自动布局的弹出窗口。
usingUnityEngine;publicclassGUILayoutExample:MonoBehaviour{Rect windowRect =newRect(20,20,120,50);voidOnGUI(){
        windowRect = GUILayout.Window(0, windowRect, DoMyWindow,"My Window");}voidDoMyWindow(int windowID){if(GUILayout.Button("Hello World")){print("Got a click");}}}

8

3.12 GUILayoutOption

  • GUILayoutOption是绝大部分GUILayout方法的可选参数,他的主要作用就是控制GUI的样式。
  • 有以下这些方法会返回GUILayoutOption:
GUILayout.Width(float width)// 传递给控件以使其具有绝对宽度的选项
GUILayout.Height(float height)// 传递给控件以使其具有绝对高度的选项
GUILayout.MinWidth(float width)// 传递给控件以指定最小宽度的选项
GUILayout.MinHeight(float height)// 传递给控件以指定最小高度的选项
GUILayout.MaxWidth(float width)// 传递给控件以指定最大宽度的选项
GUILayout.MaxHeight(float width)// 传递给控件以指定最大高度的选项
GUILayout.ExpandHeight(bool expand)// 传递给控件以允许或禁止垂直扩展的选项
GUILayout.ExpandWidth(bool expand)// 传递给控件以允许或禁止水平扩展的选项

4. 其他

以上主要就是进行OnGUI的使用,实际上,GUILayout类还能用于Editor方法。Editor类与GUILayout类进行编辑器拓展,列如:

usingUnityEditor;usingUnityEngine;[CustomEditor(typeof(GUILayoutExample))]publicclassGUILayoutEditor:Editor{publicoverridevoidOnInspectorGUI(){base.OnInspectorGUI();GUILayoutExample tar = target asGUILayoutExample;if(GUILayout.Button("开始调试")){
            tar.TestFunc();}}}

10

标签: unity 编辑器 c#

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

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

还没有评论