Unity中的GUI

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;
	}
}

输入框

函数名

  1. TextArea
  2. TextField,返回值均为string,想要持续改变输入值,原理与单选框的int标识原理一样:将这一帧的输入结果保存在一个成员变量中,下一帧再将这个成员变量作为参数传入方法中
  3. PasswordField
GUI.TextArea(Rect,内容,Length,样式);
GUI.TextField(Rect,内容,Length,样式);
GUI.PasswordField(Rect,内容,替换字符,Length,样式);

拖动条

函数名

  1. HorizontalSlider
  2. 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:

  1. ScaleAndCrop:也会通过宽高比来计算图片,不会拉伸变形但是会进行裁剪。
  2. ScaleToFit:会根据宽高比和宽高中最小的值来进行计算,不会拉伸变形,会一直保持图片完全显示的状态。
  3. 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组件做出相应的设置,从而实现特定的开发需求

  1. skin 使用的皮肤风格
  2. color GUI组件的颜色
  3. tooltip 提示框
  4. changed 检测输入数据是否发动改变,如改变则返回ture
  5. backgroundColor GUI组件的背景颜色
  6. contentColor 对GUI组件的文本进行着色
  7. enable 控制GUI组件的启用状态
  8. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值