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

发布时间:2024年01月15日

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类似。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{

    void OnGUI()
    {
        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 :创建一个可让用户输入密码的文本字段。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{
    public Texture2D textureToDisplay;
    public string fieldToEdit = "Hello World";
    public string areaToEdit = "Hello World\nI've got 2 lines...";
    public string passwordToEdit = "My Password";
    void OnGUI()
    {
        //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:创建一个工具栏。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{
    int toolbarInt = 0;
    string[] toolbarStrings = { "Toolbar1", "Toolbar2", "Toolbar3" };

    void OnGUI()
    {
        toolbarInt = GUILayout.Toolbar(toolbarInt, toolbarStrings);
    }
}

2

3.4 切换框:Toggle

  • Toggle:创建一个打开/关闭的开关按钮。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{
    bool toggleTxt = false;

    void OnGUI()
    {
        toggleTxt = GUILayout.Toggle(toggleTxt, "A Toggle text");
    }
}

3

3.5 滚动条:HorizontalScroll 、VerticalScroll

  • HorizontalScroll :创建一个水平滚动条。
  • VerticalScroll:创建一个垂直滚动条。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{
    float vSbarValue;
    float hSbarValue;

    void OnGUI()
    {
        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:用户可以拖动的垂直滑动条,用于在最小值和最大值之间更改某值。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{
    float vSliderValue = 0.0f;
    float hSliderValue = 0.0f;

    void OnGUI()
    {
        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 :创建一个自动布局框。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{
    Texture tex;
    void OnGUI()
    {
        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 开始的组。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{
    void OnGUI()
    {
        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来记录自己滑动到什么地方了。和其他方法不一样的是,如果不给他加限制条件,他会把全部内容物大小计算出来然后拓展面板长度,也就是没有滑动效果。所以我们需要用一些方法来限制他。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{
    private Vector2 scrollViewRoot;
    void OnGUI()
    {
        //如果不加以限制,会导致面板强制拉伸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:创建一个对自身内容进行自动布局的弹出窗口。
using UnityEngine;

public class GUILayoutExample : MonoBehaviour
{
    Rect windowRect = new Rect(20, 20, 120, 50);

    void OnGUI()
    {
        windowRect = GUILayout.Window(0, windowRect, DoMyWindow, "My Window");
    }

    void DoMyWindow(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类进行编辑器拓展,列如:

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(GUILayoutExample))]
public class GUILayoutEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        GUILayoutExample tar = target as GUILayoutExample;
        if (GUILayout.Button("开始调试"))
        {
            tar.TestFunc();
        }
    }
}

10

文章来源:https://blog.csdn.net/backlighting2015/article/details/135563206
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。