目录
- 1. 前言
- 2. 参数
- 3. 功能
- 3.1 按钮:Button、RepeatButton
- 3.2 文本:Label、TextArea、TextField、PasswordField
- 3.3 工具栏:Toolbar
- 3.4 切换框:Toggle
- 3.5 滚动条:HorizontalScroll 、VerticalScroll
- 3.6 滑条:HorizontalSlider、VerticalSlider
- 3.7 自动布局框:Box
- 3.8 布局:BeginHorizontal、EndHorizontal、BeginVertical、EndVertical
- 3.9 滑动布局:ScrollView
- 3.10 空白间隔:Space
- 3.11 浮动窗口:Window
- 3.12 GUILayoutOption
- 4. 其他
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");
}
}
}
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);
}
}
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);
}
}
3.4 切换框:Toggle
- Toggle:创建一个打开/关闭的开关按钮。
using UnityEngine;
public class GUILayoutExample : MonoBehaviour
{
bool toggleTxt = false;
void OnGUI()
{
toggleTxt = GUILayout.Toggle(toggleTxt, "A Toggle text");
}
}
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");
}
}
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");
}
}
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");
}
}
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();
}
}
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();
}
}
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");
}
}
}
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();
}
}
}