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,无返回值
GUI.Label(Rect,内容,样式)
按钮控件
函数名
Button,按下抬起后响应一次,bool返回值
RepeatButton,按下持续响应,bool返回值
GUI.Button(Rect,内容,样式);
多选框
Toggle,点击后返回一个与传入bool值相反的bool值,bool返回值
自定义多选框设置GUIStyle选中效果和取消效果的是normal和 on normal。
GUI.Toggle(Rect,bool标识,内容,样式);
单选框
单选框是多选框的一种特殊方式,我们使用一个int标识来处理。
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
GUI.TextArea(Rect,内容,Length,样式);
GUI.TextField(Rect,内容,Length,样式);
GUI.PasswordField(Rect,内容,替换字符,Length,样式);
拖动条
函数名
- HorizontalSlider
- VerticalSlider ,float返回值
结构:
GUI.HorizontalSlider(Rect,nowValue,bottomValue,topValue,样式1,样式2,样式3);
GUI.VerticalSlider(Rect,nowValue,bottomValue,topValue,样式1,样式2,样式3);
图片绘制
函数名:
DrawTexture ,无返回值
结构:
GUI.DrawTexture(Rect,Texture,ScaleMode,bool alpjaBlend,float imageAspect ......);
ScaleMode:
- ScaleAndCrop:也会通过宽高比来计算图片,不会拉伸变形但是会进行裁剪。
- ScaleToFit:会根据宽高比和宽高中最小的值来进行计算,不会拉伸变形,会一直保持图片完全显示的状态。
- StretchToFill:始终填充慢你传入的Rect范围。
alpha:是用来控制图片是否开启透明通道。
imageAspect:自定义宽高比,如果不填默认为0,会使用图片原始宽高比。
框绘制
函数名:
无返回值。
结构:
GUI.Box(rect,内容,样式);
工具栏
函数名:
Toolbar ,int 返回值,可以用来制作类似于Unity快捷工具栏的UI
结构:
GUI.Toolbar(Rect,int标识,内容数组,样式);
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控件进行分组
结构:
GUI.BeginGroup(Rect,内容,样式);
应用:
GUI.BeginGroup(Rect,内容,样式);
//中间添加要分组的控件
GUI.EndGaroup();
滚动列表
函数名:
BeginScorllView,返回值为Vector2
结构:
GUI.BeginScorllView(viewRect,newPos,showRect,样式);
参数介绍:
1、viewRect:当前前方可使窗口的Rect
2、showRect:当前后方内容窗口的Rect
3、nowPos:当前内容的坐标
应用:
GUI.BeginScorllView(viewRect,nowPos,showRect,样式);
//可视窗口的内容
GUI.EndScorllView();
窗口
函数名:
Window,Rect返回值。用于制作UI窗口,Window中的UI控件应当写在Window的委托参数的函数中
结构:
GUI.Window(id,Rect,控件委托,内容,样式);
参数介绍:
1、id:窗口id,负责区分不同窗口。在委托函数中也可以通过
2、委托函数:用于处理窗口控件函数
模态窗口
函数名:
ModalWindow,无返回值,当出现模态窗口时,只有处理完警告弹窗的逻辑后,其他控件逻辑才允许被继续处理常用于警告弹窗。
结构:
GUI.Window(id,Rect,控件委托,内容,样式);
拖动窗口
使用成员变量接收Rect返回值,并在委托函数中写GUI.DragWindow方法
DragWindow可以使用重载传入Rect参数,作用是决定窗口的那一部分位置可以被拖动
默认不填就是窗口的所有位置都可以被拖动
整体皮肤样式
GUIskin就是一个GUIstyle的集合
GUIskin可以在资源视图右键创建
应用:
GUI.skin=skin;
GUILayout自动布局
GUILayout拥有GUI类所有的控件。但与GUI类不同时,GUILayout可以自动排序
水平排序:
BeginHorizontal
EndVertical
布局选项GUILayoutOption
一些控件是有GUILayoutOption[]的params数组参数的,直接添加以下方法即可
//控件的固定宽高
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变量是对所使用的皮肤风格的位置
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组件的背景及文本颜色,进而实现开发的具体需求。
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组件的颜色,进而实现开发的具体要求
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组件中文本的颜色,进而实现开发的具体需求。
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,并根据需要执行相应的操作或输出一下提示信息。
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组件的启用情况。
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物体,而不是仅仅传递一个字符串。这里可以根据开发的实际需求来实现不同的提示效果。
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


2646

被折叠的 条评论
为什么被折叠?



