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("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时,若有不同的脚本需要同事运行,则可以设置这个值来确定排序。一般情况下,最上面的先执行。下面将搭建两个按钮。

 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类下的静态方法在界面内绘制所需要的控件,并通过不同控件的搭配来实现所需的界面效果

  1. Label 文本或者纹理标签控件
  2. DrawTexture 纹理图片控件
  3. Toggle 开关控件
  4. Window 窗口控件
  5. Drag Window 可拖动的窗口控件
  6. SelectionGrid 网格按钮控件
  7. BeginScrollView 滚动视图控件
  8. DrawTextureWithTexCoords 纹理图片控件
  9. RepeatButton 按钮控件
  10. PasswordField 密码文本框控件
  11. SetNextControlName 设置下一个控件名字
  12. Focus Window 焦点窗口控件
  13. BeginGroup 开始组控件,必须与EndGroup配对出现
  14. HorizontalSlider 水平的滑块控件,并且可以自己设置阈值
  15. HorizontalScrollbar 水平的滚动条控件,并且可以自己设置阈值
  16. ModalWindow 模拟窗口控件
  17. Box 图形盒子控件
  18. FocusControl 焦点控件
  19. Toolbar 工具栏控件
  20. Bring WindowToFront 使窗口到前面
  21. Bring WindowToBreak 使窗口到后面
  22. ScrollTo 将内容滚动到指定位置
  23. EndScrollView 结束滚动视图
  24. Button 按钮控件
  25. TextField 单行文本编辑控件
  26. TextArea 多行文本编辑控件
  27. GetNameOfFocusedControl 获取有焦点被命名空间的名称
  28. UnfocusWindow 失焦窗口
  29. EndGroup 结束组控件,必须与Begin Group 配对出现
  30. VerticalSlider 垂直滚动条控件,可以自己设置阈值

1、Label控件
Label控件用于在屏幕上绘制文本或者纹理标签。一般情况下创建此控件对象采用的是静态方法。

 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控件用于在给定的坐标系内绘制一幅纹理图,一般情况下创建此控件对象所采用的静态方法

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);
 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控件用于在给定的坐标系内绘制一幅纹理图,一般情况下创建此控件对象所采用的静态方法

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控件用于在自定义的区域内绘制一个图形化的盒子

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 参数表示盒子的使用样式

 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控件用于绘制一个单次按下按钮,当用户单击此按钮时会立即触发事件

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事件。

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);
 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控件用于绘制一个单行文本框,用户可以在里面编辑一个字符串

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控件用于绘制一个可编辑密码的文本框

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);
 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控件用于绘制一个多行文本编辑框,用户可以在里面编辑一段字符串。

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);
 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控件用于给下一步控制设置事件名字

public static void SetNextControlName(string name);
name为事件名字
 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控件用于通过键盘在当前焦点处输入值。

public static void FocusControl(string name);

此方法中的参数name表示焦点所要移动到的控件的名称

创建FocusControl控件,可以在当前焦点处通过键盘输入值然后显示。

    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控件用于绘制开关,我们可以通过控制开关的闭合来执行一下具体的操作

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:开关按钮的使用样式

  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控件用于绘制一个工具条,在里面可以置入一些工具按钮

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:工具栏的使用样式

 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控件用于绘制网络按钮,用户可以在自定义的网格内置入具体功能按钮

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 表示网格按钮的使用样式

 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控件用于绘制水平滑块,用户可以自己设置阈值

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样式。

 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控件用于绘制一个垂直的滑块,并且可以自己设置阈值。

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样式

 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控件用于绘制一个水平滚动条,并且可以设置阈值

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 :滚动条背景的样式

 //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控件用于绘制一个垂直滚动条,并且可以设置阈值

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表示滑动条在屏幕上的矩形位置

  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控件配合来结束一个组

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配对出现。

public static void EndGroup()
此方法无参数,主要用于结束一个组
 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中创建一个滚动视图

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中撤销一个滚动视图

public static void EndScrollView();
public static void EndScrollView(bool handleScrollWheel);

21、ScrollTo控件
ScrollTo控件用于将内容滚动到给定坐标的位置

public static void ScrollTo(Rect position)
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控件之上

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: 用户窗口的可选样式

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。

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类型,即窗口所在的矩形。

    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控件用于绘制一个可拖动的窗口,并且可以设置其可拖动的区域

public static void DragWindow()
public static void DragWindow(Rect position)

position:能够拖动窗口的位置

 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控件用于将当前窗口显示至最上面,即将当前窗口设置在创建的所有窗口的最上面。

public static void BringWindowToFront(int windowID);
  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控件用于将当前窗口移至最下面,即将当前窗口置于创建的所有的窗口的最下方。

public static void BringWindowToBack(int windowID)
  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控件用于使一个窗口成为活动窗口

public static void FocusWindow(int windowID)
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即可完成设置。

public static void UnfocusWindow()
 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即可完成设置

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: 用户窗口的可选样式

 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控件

你可能感兴趣的:(unity,游戏引擎)