GUI:游戏用户交互界面,一个代码驱动的UI系统
GUI的主要作用
1、作为程序员的调试工具
2、为脚本组件创建自定义监视面板
3、创建新的编辑器窗口和工具以拓展Unity本身(一般作为内置游戏工具)
GUI工作原理
1、OnGUI是每帧执行,相当于专门绘制GUI界面的函数
2、一般只在其中执行GUI相关界面绘制和操作逻辑
3、该函数在OnDisable之前,在LateUpdate之后
4、只要是继承了Mono的脚本,都可以在OnGUI中绘制GUI
GUI空间的共同点
1、所有的GUI控件都是GUI类的静态函数
2、所有的GUI控件参数列表大同小异:
1、位置参数:Rect参数
2、显示文本:string参数
3、图片参数:Texture参数
4、综合信息:GUIContent参数,可以既有文本信息又有图片信息
5、自定义样式:GUIStyle参数
3、每一种控件都有多种重载,都是各个参数的排列组合,但所有控件一定都有位置信息和显示信息。
4、通常采用接受返回值来保证数据更新(只有返回值被接收了下一次程序进如GUI函数,值才会更新)
文本控件
函数名:
Label,无返回值
csharp
GUI.Label(Rect,内容,样式)
按钮控件
函数名
Button,按下抬起后响应一次,bool返回值
RepeatButton,按下持续响应,bool返回值
csharp
GUI.Button(Rect,内容,样式);
多选框
Toggle,点击后返回一个与传入bool值相反的bool值,bool返回值
自定义多选框设置GUIStyle选中效果和取消效果的是normal和 on normal。
csharp
GUI.Toggle(Rect,bool标识,内容,样式);
单选框
单选框是多选框的一种特殊方式,我们使用一个int标识来处理。
csharp
private void index=1;
private void OnGUI()
{
if(GUI.Toggle(new Rect(0,60,100,30),index==1,"选项1"))
{
index=1;
}
if(GUI.Toggle(new Rect(0,100,100,30),index==2,"选项2"))
{
index=2;
}
if(GUI.Toggle(new Rect(0,140,100,30),index==3,"选项3"))
{
index=3;
}
}
输入框
函数名
- TextArea
- TextField,返回值均为string,想要持续改变输入值,原理与单选框的int标识原理一样:将这一帧的输入结果保存在一个成员变量中,下一帧再将这个成员变量作为参数传入方法中
- PasswordField
csharp
GUI.TextArea(Rect,内容,Length,样式);
GUI.TextField(Rect,内容,Length,样式);
GUI.PasswordField(Rect,内容,替换字符,Length,样式);
拖动条
函数名
- HorizontalSlider
- VerticalSlider ,float返回值
结构:
csharp
GUI.HorizontalSlider(Rect,nowValue,bottomValue,topValue,样式1,样式2,样式3);
GUI.VerticalSlider(Rect,nowValue,bottomValue,topValue,样式1,样式2,样式3);
图片绘制
函数名:
DrawTexture ,无返回值
结构:
csharp
GUI.DrawTexture(Rect,Texture,ScaleMode,bool alpjaBlend,float imageAspect ......);
ScaleMode:
- ScaleAndCrop:也会通过宽高比来计算图片,不会拉伸变形但是会进行裁剪。
- ScaleToFit:会根据宽高比和宽高中最小的值来进行计算,不会拉伸变形,会一直保持图片完全显示的状态。
- StretchToFill:始终填充慢你传入的Rect范围。
alpha:是用来控制图片是否开启透明通道。
imageAspect:自定义宽高比,如果不填默认为0,会使用图片原始宽高比。
框绘制
函数名:
无返回值。
结构:
csharp
GUI.Box(rect,内容,样式);
工具栏
函数名:
Toolbar ,int 返回值,可以用来制作类似于Unity快捷工具栏的UI
结构:
csharp
GUI.Toolbar(Rect,int标识,内容数组,样式);
csharp
private int toolbarIndex=0;
private string[] toolbarInfos=new []{"123","456","789"};
private void OnGUI()
{
toolbarIndex=GUI.Toolbar(new Rect(0,0,200,30),toolbarIndex,toolbarInfos);
switch(toolbarIndex)
{
case 0:
break;
case 1:
break;
case 2:
break;
}
}
选择网络
函数名:
SelectionGrid,与工具栏相同,但多一个限制每行的最多个数的属性xCount
分组
函数名:
BeginGroup,无返回值,主要用于对GUI控件进行分组
结构:
csharp
GUI.BeginGroup(Rect,内容,样式);
应用:
csharp
GUI.BeginGroup(Rect,内容,样式);
//中间添加要分组的控件
GUI.EndGaroup();
滚动列表
函数名:
BeginScorllView,返回值为Vector2
结构:
csharp
GUI.BeginScorllView(viewRect,newPos,showRect,样式);
参数介绍:
1、viewRect:当前前方可使窗口的Rect
2、showRect:当前后方内容窗口的Rect
3、nowPos:当前内容的坐标
应用:
csharp
GUI.BeginScorllView(viewRect,nowPos,showRect,样式);
//可视窗口的内容
GUI.EndScorllView();
窗口
函数名:
Window,Rect返回值。用于制作UI窗口,Window中的UI控件应当写在Window的委托参数的函数中
结构:
csharp
GUI.Window(id,Rect,控件委托,内容,样式);
参数介绍:
1、id:窗口id,负责区分不同窗口。在委托函数中也可以通过
2、委托函数:用于处理窗口控件函数
模态窗口
函数名:
ModalWindow,无返回值,当出现模态窗口时,只有处理完警告弹窗的逻辑后,其他控件逻辑才允许被继续处理常用于警告弹窗。
结构:
csharp
GUI.Window(id,Rect,控件委托,内容,样式);
拖动窗口
使用成员变量接收Rect返回值,并在委托函数中写GUI.DragWindow方法
DragWindow可以使用重载传入Rect参数,作用是决定窗口的那一部分位置可以被拖动
默认不填就是窗口的所有位置都可以被拖动
整体皮肤样式
GUIskin就是一个GUIstyle的集合
GUIskin可以在资源视图右键创建
应用:
csharp
GUI.skin=skin;
GUILayout自动布局
GUILayout拥有GUI类所有的控件。但与GUI类不同时,GUILayout可以自动排序
水平排序:
BeginHorizontal
EndVertical
布局选项GUILayoutOption
一些控件是有GUILayoutOption[]的params数组参数的,直接添加以下方法即可
csharp
//控件的固定宽高
GUILayout.Width();
GUILayout.Height();
//允许控件的最小宽高
GUILayout.MinWidth();
GUILayout.MinHeight();
//允许控件的最大框高
GUILayout.MaxWidth();
GUILayout.MaxHeight();
//允许或禁止水平拓展
GUILayout.ExpandWidth();
GUILayout.ExpandHeight();`
GUI系统
一般的游戏设置界面和帮助界面都是通过对GUI组件中的各个控件的合理使用而搭建成的。
GUI组件的绘制位置是通过坐标定位的。以屏幕左上角为坐标位置(0,0),屏幕右下角为坐标位置(Screen.Width,Screen.Height),并且是以像素为坐标单位进行开发的。
GUI组件的变量
Unity提供了丰富的GUI组件变量,通过这些变量,用户可以在整体上对GUI组件做出相应的设置,从而实现特定的开发需求
- skin 使用的皮肤风格
- color GUI组件的颜色
- tooltip 提示框
- changed 检测输入数据是否发动改变,如改变则返回ture
- backgroundColor GUI组件的背景颜色
- contentColor 对GUI组件的文本进行着色
- enable 控制GUI组件的启用状态
- depth 按深度排序执行当前GUI组件的行为
1、skin变量
skin变量是对所使用的皮肤风格的位置
csharp
public class Skin : MonoBehaviour
{
public GUISkin[] gskin;//GUISkin资源引用
public int skin_Index = 0;//使用皮肤的索引
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))//按Space键
{
skin_Index++;//索引加1
if (skin_Index >= gskin.Length)//索引大于gskin数组长度
{
skin_Index = 0;//重置索引
}
}
}
private void OnGUI()
{
GUI.skin = gskin[skin_Index];//设置皮肤
if (GUI.Button(new Rect(0, 0, Screen.width / 10, Screen.height / 10), "a button"))
{
Debug.Log("Button has been pressed");//输出单击信息
}
GUI.Label(new Rect(0, Screen.height * 3 / 10, Screen.width / 10, Screen.height / 10), "a lable");
}
}
//通过Space键切换效果
//
2、color变量
color变量用于控制GUI组件的颜色。在开发过程中可以通过设置color的值来改变GUI组件的背景及文本颜色,进而实现开发的具体需求。
csharp
private void OnGUI()//声明OnGUI方法
{
GUI.color = Color.yellow;//将颜色设置为黄色
GUI.Label(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 5, Screen.height / 10), "Hellow World");//绘制一个标签
GUI.Box(new Rect(Screen.width / 10, Screen.height / 5, Screen.width / 5, Screen.height / 5), "A Box");//绘制一个盒子
GUI.Button(new Rect(Screen.width / 10, Screen.height / 2, Screen.width / 5, Screen.height / 10), "A Button");//绘制一个按钮
}
3、backgroundColor变量
backgroundColor变量用于控制GUI组件的背景颜色。在开发过程中可以通过设置backgroundColor的值来改变GUI组件的颜色,进而实现开发的具体要求
csharp
private void OnGUI()
{
GUI.backgroundColor = Color.yellow;//将背景颜色设置为黄色
GUI.Button(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 15, Screen.height / 10), "按钮A Button");//绘制一个按钮
}
4、contentColor变量
content变量用于对GUI组件中的文本着色。在开发过程中可以通过设置contentColor的值来改变GUI组件中文本的颜色,进而实现开发的具体需求。
csharp
private void OnGUI()//声明OnGUI方法
{
GUI.contentColor = Color.yellow;//将文本颜色设置为黄色
GUI.Button(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 5, Screen.height / 10), "A Button");//绘制一个按钮
}
5、changed变量
changed变量可以检测任何控件中输入数据的值是否发生改变。若改变则返回true,并根据需要执行相应的操作或输出一下提示信息。
csharp
public string stringToEdit = "Modify me";//声明一个字符串stringToEdit
private void OnGUI()
{
//绘制一个单行文本编辑框,并将输入的数据赋给变量stringToEdit
stringToEdit = GUI.TextField(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 4, Screen.height / 10), stringToEdit, 25);
if (GUI.changed)
{
Debug.Log("Text field has changed");//若检测到输入数据发生改变,则输出信息提示
}
}
6、enable变量
enabled变量可以判断GUI组件是否被启用,在开发过程中可以对enable变量的boolean值进行设置,从而控制GUI组件的启用情况。
csharp
public bool allOptions = true;//声明一个初始值为true的布尔型变量allOptions
public bool extended1 = true;//声明一个初始值为true的布尔型变量extended1
public bool extended2 = true;//声明一个初始值为true的布尔值变量extended2
private void OnGUI()
{
//在自定义区域内绘制一个名为Edit Options的开关,其初始状态为allOptions
allOptions = GUI.Toggle(new Rect(0, 0, Screen.width / 5, Screen.height / 10), allOptions, "Edit All Options");
GUI.enabled = allOptions;//将allOptions的值赋给enable组件
//在各个自定义的区域内绘制两个开关
extended1 = GUI.Toggle(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 5, Screen.height / 10), extended1, "Extended Option1");
extended2 = GUI.Toggle(new Rect(Screen.width / 10, Screen.height / 5, Screen.width / 5, Screen.height / 10), extended2, "Extended Option2");
GUI.enabled = true;
//在自定义的区域内绘制一个名为ok的按钮,并判断是否被按下
if (GUI.Button(new Rect(0, Screen.height * 3 / 10, Screen.width / 5, Screen.height / 10), "Ok"))
print("user clicked ok");
}
7、tooltip变量
tooltip变量是提示框变量。在创建GUI控件,该变量可以传递一个工具作为提示信息。该变量可以通过改变内容参数去自定义GUIContent物体,而不是仅仅传递一个字符串。这里可以根据开发的实际需求来实现不同的提示效果。
csharp
private void OnGUI()
{
//绘制一个名为Click me的按钮,并设置提示信息This is the tooltip
GUI.Button(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 5, Screen.height / 10), new GUIContent("Click me", "This is the tooltip"));
//绘制一个标签,并将提示信息赋给标签
//Screen.width 和 Screen.height 是Unity引擎提供的屏幕分辨率宽度和高度属性。
//Screen.width / 10 表示屏幕宽度的十分之一,作为矩形左上角的x坐标。
//Screen.height / 5 表示屏幕高度的五分之一,作为矩形左上角的y坐标。
//Screen.width / 5 表示屏幕宽度的五分之一,作为矩形的宽度。
//Screen.height / 10 表示屏幕高度的十分之一,作为矩形的高度。
//所以,这个 Rect 实例定义了一个相对于整个屏幕来说位于左上角、宽高比为2: 1的小矩形区域。
//这个矩形区域可以被用作窗口的位置和大小,或者在GUI绘制时指定控件的位置和尺寸等。
GUI.Label(new Rect(Screen.width / 10, Screen.height / 5, Screen.width / 5, Screen.height / 10), GUI.tooltip);
}
8、depth变量
depth变量是按照深度对当前执行的GUI控件进行排序的行为,因此在搭建GUI时,若有不同的脚本需要同事运行,则可以设置这个值来确定排序。一般情况下,最上面的先执行。下面将搭建两个按钮。
csharp
public static int guiDepth = 0;//声明一个初始值为0的静态整型变量guiDepth
private void OnGUI()
{
GUI.depth = guiDepth;//将GUI.depth设置为guiDepth
if (GUI.RepeatButton(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 5, Screen.height / 5), "GoBack")) //绘制一个名为GoBack的RepeatButton
{
guiDepth = 1;//若持续单击按钮GoBack的RepeatButton
depth.guiDepth = 0;//将depth.guiDepth的值转为0
}
}
----------------------------------------------------------------------------------------------
public static int guiDepth = 1;
private void OnGUI()
{
GUI.depth = guiDepth;
if (GUI.RepeatButton(new Rect(Screen.width / 5, Screen.height / 5, Screen.width / 5, Screen.height / 5), "GoBack"))
{
guiDepth = 1;
depth2.guiDepth = 0;
}
}
GUI中的常用控件
Unity提供了丰富的GUI控件,使用这些控件要通过系统所提供的GUI工具类。我们可以调用GUI类下的静态方法在界面内绘制所需要的控件,并通过不同控件的搭配来实现所需的界面效果
- Label 文本或者纹理标签控件
- DrawTexture 纹理图片控件
- Toggle 开关控件
- Window 窗口控件
- Drag Window 可拖动的窗口控件
- SelectionGrid 网格按钮控件
- BeginScrollView 滚动视图控件
- DrawTextureWithTexCoords 纹理图片控件
- RepeatButton 按钮控件
- PasswordField 密码文本框控件
- SetNextControlName 设置下一个控件名字
- Focus Window 焦点窗口控件
- BeginGroup 开始组控件,必须与EndGroup配对出现
- HorizontalSlider 水平的滑块控件,并且可以自己设置阈值
- HorizontalScrollbar 水平的滚动条控件,并且可以自己设置阈值
- ModalWindow 模拟窗口控件
- Box 图形盒子控件
- FocusControl 焦点控件
- Toolbar 工具栏控件
- Bring WindowToFront 使窗口到前面
- Bring WindowToBreak 使窗口到后面
- ScrollTo 将内容滚动到指定位置
- EndScrollView 结束滚动视图
- Button 按钮控件
- TextField 单行文本编辑控件
- TextArea 多行文本编辑控件
- GetNameOfFocusedControl 获取有焦点被命名空间的名称
- UnfocusWindow 失焦窗口
- EndGroup 结束组控件,必须与Begin Group 配对出现
- VerticalSlider 垂直滚动条控件,可以自己设置阈值
1、Label控件
Label控件用于在屏幕上绘制文本或者纹理标签。一般情况下创建此控件对象采用的是静态方法。
csharp
public static void label(Rect position, string text);
public static void Label(Rect position, Texture image);
public static void Label(Rect position, GUIContext content);
public static void Label(Rect postion , string text , GUIStyle style);
public static void Label(Rect postion , Texture image , GUIStyle style);
public static void Label(Rect postion , GUIContent content , GUIStyle style);
position 参数表示标签在屏幕上的位置
text 参数表示标签显示的文本
image 参数表示标签上显示的纹理
content 参数表示标签上显示的文本、图片和信息提示
style 参数表示使用样式
2、DrawTexture控件
DrawTexture控件用于在给定的坐标系内绘制一幅纹理图,一般情况下创建此控件对象所采用的静态方法
csharp
public static void DrawTexture(Rect position,Texture image);
public static void DrawTexture(Rect position,Texture image ,ScaleMode scaleMode);
public static void DrawTexture(Rect position,Texture image,ScaleMode scaleMode,bool alphaBlend,float imageAspect);
csharp
public Texture aTexture;//声明一个纹理图
private void OnGUI()
{
GUI.DrawTexture(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 5, Screen.height / 5), aTexture, ScaleMode.ScaleToFit, true, 0.0f);
}
3、DrawTextureWithTexCoords控件
DrawTextureWithTexCoords控件用于在给定的坐标系内绘制一幅纹理图,一般情况下创建此控件对象所采用的静态方法
csharp
public static void DrawTextureWithTexCoords(Rect position , Texture image , Rect texCoords);
public static void DrawTextureWithTexCoords(Rect position , Texture image , Rect texCoords , bool alphaBlend);
4、Box控件
Box控件用于在自定义的区域内绘制一个图形化的盒子
csharp
public static void Box(Rect position , string text);
public static void Box(Rect position , Texture image);
public static void Box(Rect position , GUIContent content);
public static void Box(Rect position , string text , GUIStyle style);
public static void Box(Rect position , Texture image , GUIStyle style);
public static void Box(Rect position , GUIContent content , GUIStyle style);
position 参数表示盒子在屏幕上的矩形位置
text 参数表示在盒子上显示的文本
image 参数表示在盒子上显示的纹理图
content 参数表示盒子的文本、图片和提示信息
style 参数表示盒子的使用样式
csharp
private void OnGUI()
{
//在屏幕的自定义范围内绘制一个内容为This is a tiele的Box控件
GUI.Box(new Rect(Screen.width / 5, Screen.height / 5, Screen.width / 2, Screen.height / 2), "This is a title");
}
5、Button控件
Button控件用于绘制一个单次按下按钮,当用户单击此按钮时会立即触发事件
csharp
public static bool Button(Rect position ,string text);
public static bool Button(Rect position,Texture image);
public static bool Button(Rect position , GUIContent content);
public static bool Button(Rect position , string text ,GUIStyle style);
public static bool Button(Rect position , GUIContent content , GUIStyle style);
position 参数表示盒子在屏幕上的矩形位置
text 参数表示在盒子上显示的文本
image 参数表示在盒子上显示的纹理图
content 参数表示盒子的文本、图片和提示信息
style 参数表示盒子的使用样式
6、RepeatButton控件
RepeatButton控件用于创建一个按钮,该按钮只有在用户持续按下时才会被激活,并且从按住按钮到释放按钮的时间内将连续不断地发送OnClick事件。
csharp
public static bool RepeatButton(Rect position , string text);
public static bool RepeatButton(Rect position , Texture image);
public static bool RepeatButton(Rect position , GUIContent content);
public static bool RepeatButton(Rect position , string text ,GUIStyle style);
public static bool RepeatButton(Rect position , Texture image ,GUIStyle style);
public static bool RepeatButton(Rect position , GUIContent content , GUIStyle style);
csharp
public Texture btnTexture;//声明一个纹理图
private void OnGUI() //声明OnGUI方法
{
if (!btnTexture)
{
Debug.LogError("若不存在,则输出提示信息");
return;
}
if (GUI.RepeatButton(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 10, Screen.width / 10), btnTexture)) //绘制一个纹理图ReapeatButton
{
Debug.Log("若持续按下按钮,则输出提示信息Image");
}
if (GUI.RepeatButton(new Rect(Screen.width / 10, Screen.height / 3, Screen.width / 5, Screen.height / 10), "Click")) //绘制一个文本RepeatButton
{
Debug.Log("若持续按下按钮,则输出提示信息Text");
}
}
7、TextField控件
TextField控件用于绘制一个单行文本框,用户可以在里面编辑一个字符串
csharp
public static string TextField(Rect position , string text);
public static string TextField(Rect position ,string text, GUIStyle style);
public static string TextField(Rect position , string text,int maxLength);
public static string TextField(Rect position , string text ,int maxLength ,GUIStyle style);
8、PasswordField控件
Password控件用于绘制一个可编辑密码的文本框
csharp
public static string PasswordField(Rect position ,string password ,char maskChar );
public static string PasswordField(Rect position ,string password ,char maskChar ,GUIStyle style);
public static string PasswordField(Rect position ,string password ,char maskChar ,int maxLength)
public static string PasswordField(Rect position ,string password ,char maskChar,int maxLength,GUIStyle style);
csharp
public string passwordToEdit = "My Password";//声明一个字符串
private void OnGUI()
{
//绘制一个密码编辑框,并设置*号来代替密码,设置密码编辑框的最大长度为25
passwordToEdit = GUI.PasswordField(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 2, Screen.height / 10), passwordToEdit, "*"[0], 25);
}
9、TextArea控件
TextArea控件用于绘制一个多行文本编辑框,用户可以在里面编辑一段字符串。
csharp
public static string TextArea(Rect position , string text);
public static string TextArea(Rect position , string text, GUIStyle style);
public static string TextArea(Rect position , string text ,int maxLength);
public static string TextArea(Rect position ,string text ,int maxLength,GUIStyle style);
csharp
public string stringToEdit = "Hello World\nI,ve got 2 lines...";
private void OnGUI()
{
//绘制一个多行文本编辑框,将已声明的字符串赋给它,并设置其最大长度为200
stringToEdit = GUI.TextArea(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 2, Screen.height / 2), stringToEdit, 200);
}
10、SetNextControlName控件和GetNameOfFousedControl控件
SetNextControlName控件用于给下一步控制设置事件名字
csharp
public static void SetNextControlName(string name);
name为事件名字
csharp
public string login = "username";
public string login2 = "no action here";
private void OnGUI()
{
//设置下一步控制事件的名字为user
GUI.SetNextControlName("user");
//绘制下一个单行文本编辑框
login = GUI.TextField(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 3, Screen.height / 10), login);
if (Event.current.Equals(Event.KeyboardEvent("return")) && GUI.GetNameOfFocusedControl() == "user")//判断当前事件是否为键盘事件return
{
Debug.Log("Login");
}
if (GUI.Button(new Rect(Screen.width / 2, Screen.height / 10, Screen.width / 5, Screen.height / 10), "Login"))
{
Debug.Log("Login");
}
}
11、FocusControl控件
FocusControl控件用于通过键盘在当前焦点处输入值。
csharp
public static void FocusControl(string name);
此方法中的参数name表示焦点所要移动到的控件的名称
创建FocusControl控件,可以在当前焦点处通过键盘输入值然后显示。
csharp
public string username = "username";//声明一个内容为username的字符串username
public string pwd = "a pwd";//声明一个内容为 a pwd 的字符串pwd
private void OnGUI()
{
GUI.SetNextControlName("MyTextField");//将下一步的控制事件命名为MyTextField
//绘制一个单行文本编辑框,并将字符串username的内容赋给它
username = GUI.TextField(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 3, Screen.height / 10), username);
//绘制一个单行文本编辑框,并将字符串pwd的内容赋给它
pwd = GUI.TextField(new Rect(Screen.width / 10, Screen.height / 4, Screen.width / 3, Screen.height / 10), pwd);
//绘制一个名为Move Focus的按钮,并判断按钮是否被按下
if (GUI.Button(new Rect(Screen.width / 10, Screen.height * 2 / 5, Screen.width / 6, Screen.height / 10), "Move Focus"))
{
GUI.FocusControl("MyTextField");
}
}
12、Toggle控件
Toggle控件用于绘制开关,我们可以通过控制开关的闭合来执行一下具体的操作
csharp
public static bool Toggle(Rect position ,bool value ,string text);
public static bool Toggle(Rect position,bool value,Texture image);
public static bool Toggle(Rect position,bool value,GUIContent content);
public static bool Toggle(Rect position,bool value,string text,GUIStyle style);
public static bool Toggle(Rect position,bool value ,Texture image ,GUIStyle style);
public static bool Toggle(Rect position,bool value,GUIContent content,GUIStyle style);
public static bool Toggle(Rect position,int id ,bool value ,GUIContent content,GUIStyle style);
position:开关按钮在屏幕上的矩形位置
value:开关按钮的初始开关状态
text:按钮上显示的文本
image:按钮显示的纹理图
content:按钮的文本、图片和提示信息
style:开关按钮的使用样式
csharp
public Texture aTexture;//声明一个纹理图
private bool toggleTxt = false;//声明一个初始值为false的布尔变量toggleTxt
private bool toggleImg = false;//声明一个初始值为false的布尔变量toggleImg
private void OnGUI()
{
if (!aTexture)
{
Debug.LogError("没有挂载纹理到Inspector");
return;
}
//绘制一个名为 A Toggle text 且初始状态为toggleTxt的开关
toggleTxt = GUI.Toggle(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 3, Screen.height / 10), toggleTxt, "A Toggle text");
//绘制一个纹理图为aTexture且初始状态为toggleImg的开关
toggleImg = GUI.Toggle(new Rect(Screen.width / 10, Screen.height / 4, Screen.width / 10, Screen.height / 10), toggleImg, aTexture);
}
13、Toolbar控件
Toolbar控件用于绘制一个工具条,在里面可以置入一些工具按钮
csharp
public static int Toolbar(Rect position,int selected ,string[] texts)
public static int Toolbar(Rect position,int selected ,Texture[] images)
public static int Toolbar(Rect position,int selected ,GUIContent[] content)
public static int Toolbar(Rect position,int selected ,string[] texts,GUIStyle style);
public static int Toolbar(Rect position,int selected,Texture[] image,GUIStyle style);
public static int Toolbar(Rect position,int selected ,GUIContent[] contents,GuIStyle style);
position:工具栏在屏幕上的矩形位置
seleted:被选择按钮的索引号
texts:显示在工具栏按钮上的字符串数组
images:参数表示显示在工具栏按钮上的纹理图数组
content:工具栏的文本、图片和提示信息
style:工具栏的使用样式
csharp
public int toolbarInt = 0;//声明一个初始值为0的整形变量toolbarInt
public string[] toolbarStrings = new string[] { "Toolbar1", "Toolbar2", "Toolbar3" };//声明一个具有内容的字符型数组
private void OnGUI()
{
//绘制一个内容为toolbarStrings且当前焦点在第toolbarInt上的工具条
toolbarInt = GUI.Toolbar(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 2, Screen.height / 10), toolbarInt, toolbarStrings);
}
14、SelectionGrid控件
SelectionGrid控件用于绘制网络按钮,用户可以在自定义的网格内置入具体功能按钮
csharp
public static int SelectionGrid(Rect position,int selected , string[]texts , int xCount);
public static int SelectionGrid(Rect position,int selected , Texture[] images ,int xCount);
public static int SelectionGrid(Rect position,int selected ,GUIContent[] content ,int xCount);
public static int SelectionGrid(Rect position ,int selected ,string[] texts ,int xCount ,GUIStyle style);
public static int SelectionGrid(Rect position ,int selected ,Texture[] images,int xCount ,GUIStyle style);
public static int SelectionGrid(Rect position,int selected ,GUIContent[] content,int xCount,GUIStyle style);
position 表示网格在屏幕上的矩形位置
selected 表示被选择表格按钮的索引号
texts 表示显示在网格按钮上的字符串数组
images 表示显示在网格按钮上的纹理图数组
content 表示网格按钮的文本、图片和提示信息
xCount 表示水平方向向上的元素个数
style 表示网格按钮的使用样式
csharp
public int selGridInt = 0;//声明一个初始值为0的整型变量selGridInt
public string[] selStrings = new string[] { "Grid1", "Grid2", "Grid3", "Grid4" };//声明一个具有内容的字符型数组
private void OnGUI()
{
//绘制一个内容selStrings且当前焦点在第selGridInt上的网络按钮控件
selGridInt = GUI.SelectionGrid(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 2, Screen.height / 3), selGridInt, selStrings, 2);
}
SelectionGrid控件返回的是int类型的选择按钮的索引号
15、HorizontalSlider控件
HorizontalSlider控件用于绘制水平滑块,用户可以自己设置阈值
csharp
public static float HorizontalSlider(Rect position,float value ,float leftValue,float rightValue);
public static float HorizontalSlider(Rect position,float value ,float leftValue,float rightValue,GUIStyle slider,GUIStyle thumb);
position 表示滑块条在屏幕上的矩形位置
value 表示滑动条的值,确定可拖行滑块的位置
leftValue:表示滑动条最左边的值
rightValue:滑动条最右边的值
slider:用于显示可拖动区域的GUI样式,thumb表示用于显示可拖动滑块的GUI样式。
csharp
public float hSliderValue = 0.0F;
private void OnGUI()
{
//绘制一个初始值为hSliderValue的水平滚动条
hSliderValue = GUI.HorizontalSlider(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 3, Screen.height / 10), hSliderValue, 0.0F, 10.0F);
}
16、VerticalSlider控件
VerticalSlider控件用于绘制一个垂直的滑块,并且可以自己设置阈值。
csharp
public static float VerticalSlider(Rect position,float value ,float topValue ,float bottomValue);
public static float VerticalSlider(Rect position,float value ,float value ,float topValue,float bottomValue,GUIStyle slider,GUIStyle thumb);
position 表示滑动条在屏幕上的矩形位置
value:表示滑动条的值,它确定了可拖动滑块的位置
topValue:表示滑动条最顶部的值
bottomValue:表示滑动条最底部的值
slider:表示用于显示可拖动区域GUI样式
thumb:表示用于显示可拖动滑块的GUI样式
csharp
public float vSliderValue = 0.0F;//声明一个初始值为0.0F的浮点型变量vSliderValue
private void OnGUI()
{
//绘制一个初始值为vSliderValue的竖值滑块
vSliderValue = GUI.VerticalSlider(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 10, Screen.height / 3), vSliderValue, 10.0F, 0.0F);
}
17、HorizontalScrollbar控件
HorizontalScrollbar控件用于绘制一个水平滚动条,并且可以设置阈值
csharp
public static float HorizontalScrollbar(Rect position,float value,float size,float leftValue,float rightValue);
public static float HorizontalScrollbar(Rect position,float value,float size,float leftValue,float leftValue,float rightValue,GUIStyle style);
position: 表示滑动条在屏幕上的矩形位置
value :滑动条的值,可以确定可拖动滑块的位置
size: 可以所能看到的大小
leftValue:表示滑块条最左端的值
rightValue:滑动条最右端的值
style :滚动条背景的样式
csharp
//HorizontalScrollbar控件返回值为float类型,并且能通过用户拖动滚动条或单击滚动条上的箭头来改变其值。
public static float hSbarValue;//声明一个浮点型变量hSbarValue
private void OnGUI()
{
//绘制一个初始值为hSbarValue的水平滚动条
hSbarValue = GUI.HorizontalScrollbar(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 3, Screen.height / 10), hSbarValue, 1.0F, 0.0F, 10.0F);
}
HorizontalScrollbar控件返回值为float类型
18、VerticalScrollbar控件
VerticalScrollbar控件用于绘制一个垂直滚动条,并且可以设置阈值
csharp
public static float VerticalScrollbar(Rect position,float value ,float size,float topValue,float bottomValue);
public static flaot VerticalScrollbar(Rect position,float value, float size,float topValue)
position表示滑动条在屏幕上的矩形位置
csharp
public float vSbarValue;//声明一个浮点型变量vSbarValue
private void OnGUI()
{
//绘制一个初始值为vSbarValue的竖直滚动条
vSbarValue = GUI.VerticalScrollbar(new Rect(Screen.width / 10, Screen.height / 10, Screen.width / 10, Screen.height / 3), vSbarValue, 1.0F, 10.0F, 0.0F);
}
VerticalScrollbar控件返回值为float类型,并且能通过用户拖动滚动条或单击滚动条上的箭头来改变其值。
19、BeginGroup控件和EndGroup控件
BeginGroup控件用于开始一个组,但必须与EndGroup控件配合来结束一个组
csharp
public static void BeginGroup(Rect position);
public static void BeginGroup(Rect position,string text);
public static void BeginGroup(Rect position,GUIStyle style);
public static void BeginGroup(Rect position,Texture image);
public static void BeginGroup(Rect position,GUIContent content);
public static void BeginGroup(Rect position,string text,GUIStyle style);
public static void BeginGroup(Rect position,Texture image ,GUIStyle style);
public static void BeginGroup(Rect position,GUIContent content,GUIStyle style);
position:表示组在屏幕上的矩形位置
text:组上显示的文本
image:组上显示的纹理图
content:表示组的文本,图片和提示
style:组的背景样式
EndGroup控件用于结束一个组,必须与BeginGroup配对出现。
csharp
public static void EndGroup()
此方法无参数,主要用于结束一个组
csharp
private void OnGUI()
{
GUI.BeginGroup(new Rect(Screen.width / 2 - 200, Screen.height / 2 - 100, 400, 200));
GUI.Box(new Rect(0, 0, 400, 200), "在自定义区域创建一个Box控件,在Box控件用于显示的内容");
GUI.EndGroup();
}
当开始创建一个组时,里面的GUI控件的坐标系统相对于组的左上角设置为(0,0),所有的控件被限制到该组内。
20、BeginScrollView控件和EndScrollView控件
BeginScrollView控件用于在GUI中创建一个滚动视图
csharp
public static Vector2 BeginScrollView(Rect position ,Vector2 scrollPosition,Rect ViewRect);
public static Vector2 BeginScrollView(Rect position, Vector2 scrollPosition,Rect ViewRect,bool alwaysShowHorizontal,bool alwaysShowVertical);
public static Vector2 BeginScrollView(Rect position,Vector2 scrollPosition,Rect ViewRect,GUIStyle horizontalScrollbar ,GUIStyle verticalScrollbar);
public static Vector2 BeginScrollView(Rect positon ,Vector2 scrollPositon,Rect viewRect,bool alawysShowHorizontal,bool alwaysShowVertical);
position:表示组在屏幕上的矩形位置
scrollPosition:显示滚动位置
ViewRect:表示滚动视图内使用的矩形
alwaysShowHorizontal:是否显示水平滚动条
alwaysShowVertical:是否显示垂直滚动条
horzontalScrollbar:表示水平滚动条的可选GUIStyle
verticalScrollbar表示竖直滚动条的可选GUIStyle
EndScrollView控件用于在GUI中撤销一个滚动视图
csharp
public static void EndScrollView();
public static void EndScrollView(bool handleScrollWheel);
21、ScrollTo控件
ScrollTo控件用于将内容滚动到给定坐标的位置
csharp
public static void ScrollTo(Rect position)
csharp
public Vector2 scrollPos = Vector2.zero;//声明一个初始值为(0,0)的坐标scrollPos
private void OnGUI()
{
//在屏幕指定区域内创建一个自定义滚动区域
scrollPos = GUI.BeginScrollView(new Rect(
Screen.width / 10,Screen.height / 10,Screen.width / 5,Screen.height / 4 ), scrollPos, new Rect(0, 0, Screen.width / 2, Screen.height / 10) );
//创建一个名字为Go Right的按钮,并判断按钮是否被按下
if (GUI.Button(new Rect(0, 0, Screen.width / 5, Screen.height / 10), "Go Right"))
{
GUI.ScrollTo(new Rect(Screen.width / 4, 0, Screen.width / 4, Screen.height / 10));//是当前焦点则立即跳到指定的区域
}
//创建一个名字为Go Left的按钮,并判断按钮是被按下
if (GUI.Button(new Rect( Screen.width / 4,0, Screen.width/5,Screen.height / 10), "Go Left"))
{
GUI.ScrollTo(new Rect(0, 0, Screen.width / 4, Screen.height / 10));//是当前焦点则立即跳到指定的区域
}
GUI.EndScrollView();//撤销滚动视图
}
22、Window控件
Window控件用于创建弹出窗口,该窗口浮动在普通GUI控件之上
csharp
public static Rect Window(int id,Rect clientRect,GUI.WindowFunction func,string text);
public static Rect Window(int id,Rect clientRect,GUI.WindowFunction func,Texture image);
public static Rect Window(int id,Rect clientRect,GUI.WindowFunction func,GUIContent content);
public static Rect Window(int id,Rect clientRect,GUI.WindowFunction func,string text,GUIStyle style);
public static Rect Window(int id,Rect clientRect,GUI.WindowFunction func,Texture iamge);
public static Rect Window(int id,Rect clientRect,GUI.WindowFunction func,GUIContent title,GUIStyle style);
id表示每个窗口的唯一ID
clientRect:窗口组在屏幕上的矩形位置
func:在窗口中创建GUI的函数
text:窗口的标题文本显示
content:窗口的文本、图片和提示
style: 用户窗口的可选样式
csharp
public Rect windowRect = new Rect(20, 20, 120, 50);//声明窗口的矩形区域windowRect
private void OnGUI()
{
//在windowRect矩形区域内绘制一个名为My Window窗口
windowRect = GUI.Window(0, windowRect, DoMyWindow, "My Window");
}
private void DoMyWindow(int windowID)
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Hello World"))
{
print("Got a click");//若按钮被按下,则输出提示信息
}
}
Window控件浮动在普通GUI控件之上,拥有点选焦点和能被终端用户随意拖动的特点,不像其他的GUI控件,Window控件需要单独提供一个方法,此方法中可以通过代码描述Window控件中哪些子控件(如按钮、标签等)。另外,如果使用GUILayout来摆放组件,就需要配套使用GUILayout.Window
Window控件可以使用一样的函数来创建多个窗口,但是要确定每一个窗口有自己的ID。
csharp
public Rect windowRect = new Rect(20, 20, 120, 50);//声明窗口的矩形区域windowRect
private void OnGUI()
{
//在windowRect矩形区域内绘制一个名为My Window窗口
windowRect = GUI.Window(0, windowRect, DoMyWindow, "My Window");
}
private void DoMyWindow(int windowID)
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Hello World"))
{
print("Got a click");//若按钮被按下,则输出提示信息
}
}
Window控件返回Rect类型,即窗口所在的矩形。
csharp
public Rect windowRect0 = new Rect(20, 20, 120, 50);//声明窗口的矩形区域的windowRect0
public Rect windowRect1 = new Rect(20, 100, 120, 50);//声明窗口的矩形区域WwindowRect1
private void OnGUI()
{
//分别在windowRect0和windowRect1两个矩形区域内绘制两个窗口
windowRect0 = GUI.Window(0, windowRect0, DoMyWindow, "My Window");
windowRect1 = GUI.Window(1, windowRect1, DoMyWindow, "My Window");
}
//声明DoMyWindow函数,用于创建一个按钮
private void DoMyWindow(int windowID)
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Hello World"))
{
print("Got a click in window"+windowID);//若按钮被按下,则输出相关提示信息
GUI.DragWindow(new Rect(0, 0, 10000, 10000));//在自定义的矩形区域绘制一个可拖动窗口
}
}
//Window控件返回Rect类型,即窗口所在的矩形
23、DragWindow控件
DragWindow控件用于绘制一个可拖动的窗口,并且可以设置其可拖动的区域
csharp
public static void DragWindow()
public static void DragWindow(Rect position)
position:能够拖动窗口的位置
csharp
public Rect windowRect = new Rect(20, 20, 120, 50);//声明窗口的矩形区域windowRect
private void OnGUI()
{
//在windowRect区域中绘制一个内容为My Window的窗口
windowRect = GUI.Window(0, windowRect, DoMyWindow, "My Window");
}
private void DoMyWindow(int windowID)
{
GUI.DragWindow(new Rect(0, 0, 10000, 20));
}
DragWindow控件需要再代码窗口调用函数来创建一个可拖动窗口,如果想将完整的窗口背景作为拖动区域,则需使用DragWindow的不带参数版本,然后将其放在窗口函数的末尾。
24、BringWindowToFront控件
BringWindowToFront控件用于将当前窗口显示至最上面,即将当前窗口设置在创建的所有窗口的最上面。
csharp
public static void BringWindowToFront(int windowID);
csharp
private Rect windowRect = new Rect(20, 20, 120, 50);//声明窗口的矩形区域windowRect
private Rect windowRect2 = new Rect(80, 20, 120, 50);//声明窗口的矩形区域windowRect2
private void OnGUI()
{
windowRect = GUI.Window(0, windowRect, DoMyFirstWindow, "First");//绘制第一个窗口
windowRect2 = GUI.Window(1, windowRect2, DoMySecondWindow, "Second");//绘制第二个窗口
}
private void DoMyFirstWindow(int windowID)//声明DoMyFirstWindow函数
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Bring to front"))//绘制一个按钮,并判断是否被按下
{
GUI.BringWindowToFront(1);//调用BringWindowToFront方法,并将ID为1的窗口置于最上方
}
GUI.DragWindow(new Rect(0, 0, 10000, 20));//绘制一个可拖动窗口
}
private void DoMySecondWindow(int windowID)//声明DoMySecondWindow函数
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Bring to front"))//绘制一个按钮,并判断是否被按下
GUI.BringWindowToFront(0);//调用BringWindowToFront方法,将ID为0的窗口置于最上方
GUI.DragWindow(new Rect(0, 0, 10000, 20));
}
25、BringWindowToBack控件
BringWindowToBack控件用于将当前窗口移至最下面,即将当前窗口置于创建的所有的窗口的最下方。
csharp
public static void BringWindowToBack(int windowID)
csharp
private Rect windowRect = new Rect(20, 20, 120, 50);//声明窗口的矩形区域windowRect
private Rect windowRect2 = new Rect(80, 20, 120, 50);//声明窗口的矩形区域windowRect2
private void OnGUI()
{
windowRect = GUI.Window(0, windowRect, DoMyFirstWindow, "First");//绘制第一个窗口
windowRect2 = GUI.Window(1, windowRect2, DoMySecondWindow, "Second");//绘制第二个窗口
}
private void DoMyFirstWindow(int windowID)
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Put Back"))
{
GUI.BringWindowToBack(0);
}
GUI.DragWindow(new Rect(0, 0, 10000, 20));
}
private void DoMySecondWindow(int windowID)
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Put Back"))
{
GUI.BringWindowToBack(1);
}
GUI.DragWindow(new Rect(0, 0, 10000, 20));
}
26、FocusWindow控件
FocusWindow控件可以将一个窗口设置为当前焦点窗口,通过调用窗口的ID即可完成设置。
FocusWindow控件用于使一个窗口成为活动窗口
csharp
public static void FocusWindow(int windowID)
csharp
private Rect windowRect = new Rect(20, 20, 120, 50);//声明窗口的矩形区域windowRect
private Rect windowRect2 = new Rect(20, 80, 120, 50);//声明窗口的矩形区域windowRect2
private void OnGUI()
{
windowRect = GUI.Window(0, windowRect, DoMyFirstWindow, "First");//绘制第一个窗口
windowRect2 = GUI.Window(1, windowRect2, DoMySecondWindow, "Second");//绘制第二个窗口
}
private void DoMyFirstWindow(int windowID)
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Focus other"))
{
GUI.FocusWindow(1);//调用FocusWindow函数,并将ID为1的窗口设置为焦点窗口
}
}
private void DoMySecondWindow(int windowID)
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Focus other"))
{
GUI.FocusWindow(0);//调用FoucsWindow函数,并将ID为0的窗口设置为焦点窗口
}
}
27、UnfocusWindow控件
UnfocusWindow控件用于将当前的焦点窗口从所有的窗口中移除,通过调用窗口的ID即可完成设置。
csharp
public static void UnfocusWindow()
csharp
private Rect windowRect = new Rect(20, 20, 120, 50);//声明窗口的矩形区域windowRect
private Rect windowRect2 = new Rect(20, 80, 120, 50);//声明窗口的矩形区域windowRect2
private void OnGUI()
{
windowRect = GUI.Window(0, windowRect, DoMyFirstWindow, "First");//绘制第一个窗口
windowRect2 = GUI.Window(1, windowRect2, DoMySecondWindow, "Second");//绘制第二个窗口
}
private void DoMyFirstWindow(int windowID)//声明DoMyFirstWindow函数
{
if (GUI.Button(new Rect(10, 20, 100, 20), "UnFocus"))//绘制一个按钮,并判断按钮是否被按下
{
GUI.UnfocusWindow();//若被按下,则移除当前窗口的焦点
}
}
private void DoMySecondWindow(int windowID)//声明DoMySecondWindow函数
{
if (GUI.Button(new Rect(10, 20, 100, 20), "UnFocus"))//绘制一个按钮,并判断按钮是否被按下
{
GUI.UnfocusWindow();//若被按下,则移除当前窗口的焦点
}
}
UnfocusWindow控件用于从所有窗口移除焦点,即使所有窗口处于不激活状态
28、ModelWindow控件
ModelWindow控件用于创建模态窗口,通过调用窗口的ID即可完成设置
csharp
public static Rect ModalWindow(int id ,Rect clientRect,GUI.WindowFunction func,string text);
public static Rect ModalWindow(int id ,Rect clientRect,GUI.WindowFunction func,Texture image);
public static Rect ModalWindow(int id ,Rect clientRect,GUI.WindowFunction func,GUIContent content);
public static Rect ModalWindow(int id ,Rect clientRect,GUI.WindowFunction func,string text , GUIStyle style);
public static Rect ModalWindow(int id ,Rect clientRect,GUI.WindowFunction func,Texture image , GUIStyle style);
public static Rect ModalWindow(int id ,Rect clientRect,GUI.WindowFunction func,GUIContent content ,GUIStyle style);
id: 窗口的ID
clientRect:窗口组在屏幕上的矩形位置
func:窗口中创建GUI的函数
text: 窗口的标题文本显示
content: 窗口的文本、图片和提示
style: 用户窗口的可选样式
csharp
public Rect windowRect = new Rect(150, 20, 120, 50);//声明窗口的矩形区域windowRect
private bool toggle = false;
private void OnGUI()
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Hello World"))
{
print("Got a click");
}
toggle = GUI.Toggle(new Rect(150, 70, 120, 50), toggle, "Show ModalWindow");
if (toggle)
{
windowRect = GUI.ModalWindow(0, windowRect, DoMyWindow, "Modal Window");
}
}
private void DoMyWindow(int windowID)
{
if (GUI.Button(new Rect(10, 20, 100, 20), "Close Window"))
{
toggle = false;
}
}
ModalWindow与GUI.Window类似,但其窗口始终位于所有其他GUI组件的顶部,并且当其显示时,该控件将是所有GUI输入和事件的唯一接收者。
当显示ModelWindow控件时,其他控件将不会处理输入,并且异常只能显示一个ModalWindow控件