GUI介绍
用户图形界面,用来交互。unity把GUI事件创建和触发整合在了一起。
用OnGUI函数即可完成。(OnGUI每帧执行,有点像Update)
举个栗子
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Button : MonoBehaviour
{
void Start()
{
}
void Update()
{
}
void OnGUI()
{
if (Time.time % 2 < 1) //使按钮每隔一秒显示一次:闪烁
{
Rect rec = new Rect(10, 10, 120, 100);
//左上角(10,10),长度,高度
if (GUI.Button(rec, "Unity Button")) //if检测是否单击
{
Debug.Log("用户单击");
}
}
}
}
添加特殊图片样式的按钮可以public Texture2D image;
,再修改为if (GUI.Button(rec, image))
显示在unity界面如下:
在Image处添加相应的纹理即可。
如果想要同时显示图片和文字:
Rect rec = new Rect(10, 10, 120, 100);
GUIContent gt = new GUIContent("按钮", image);
if (GUI.Button(rec, gt))
{
Debug.Log("用户单击");
}
注意:!!!GUIContent !!!
大多数通用控件比如按钮和标签允许你指定控件上该呈现在控件上的的文本或者材质.如果你想在一个控件上指定文本与材质,那必须使用GUIContent结构.
GUIContent结构有几个构造函数允许你创建一个带有文本,材质和tooltip的GUIContent对象.
如果想要实现鼠标挪至按钮上,出现提示“我是提示”的效果:tooltip
Rect rec = new Rect(10, 10, 120, 100);
GUIContent gt = new GUIContent("按钮", "我是提示");
if (GUI.Button(rec, gt))
{
Debug.Log("用户单击");
}
GUI.Label(rec, GUI.tooltip);
GUI中简单控件
上述的GUI.Button就是一个按钮控件,创造一个点击触发的Button。
其他常用控件:
-
Label
如上所述:GUI.Label(rec,"我是标签")
,效果为在界面上显示一行字 -
Button
-
RepeatButton
与Button的区别在于,这个是按住按钮,按钮内指令重复执行(而Button是释放后执行) -
TextField文本输入框
Rect rec1 = new Rect(10, 10, 120, 100); Rect rec2 = new Rect(150, 160, 120, 100); text = GUI.TextField(rec1, text); if (GUI.RepeatButton(rec2, text)) { Debug.Log("用户单击"); }
- Toggle 开关
toogleBool = GUI.Toggle(rec, toggleBool, "Toggle"); //toggleBool为bool类型
- HorizontalSlider水平滑块
hs = GUI.HorizontalSlider(rec1, hs, 0, 10); //hs为float类型,0起始点位置,10终止点位置 //返回的hs是滑块在滑动条上的位置
要想要实现各个控件位置关联,比如说滑块动的时候按钮也随着动,那更改按钮Rect的位置就行,比如:
(10*hs,10,20,100)
这种 -
Box 平平无奇文本框
GUI复杂控件
-
工具条控件:Toolbar
相当于选项,几个按钮只有一个能处于被激活
用一个int变量来跟踪当前被选中的按钮:0开始public class TBar : MonoBehaviour { int toolBarInt = 0; string[] toolBarString = { "Toolbal1", "Toolbar2", "Toolbar3" }; void Start() { } void Update() { } void OnGUI() { { Rect rec1 = new Rect(10, 10, 120, 100); Rect rec2 = new Rect(150, 160, 320, 100); toolBarInt = GUI.Toolbar(rec2, toolBarInt, toolBarString); } } }
- 选择网格控件:SelectionGrid
int selectGridInt = 0; string[] SelectString = { "Sec1", "Sec2", "Sec3" }; //在OnGUI中: selectGridInt = GUI.SelectionGrid(rec2, selectGridInt, SelectString,2);
selectGridInt还是用来跟踪当前被选中的按钮的索引数值。
2定义了网格的列数。
- 检测控件更新:GUI.changed
任意控件状态改变时返回true。
GUILayout控件和 GUI群组Group
之前的几种控件都是需要指定控件位置:定义了一个Rect矩形用来定位
GUILayout控件提供自动定位的控件。
对比:
GUI.Button(rec1,"GUI控件");
GUILayout.Button("GUILayout控件");
——————————————————————————————
利用GUI.BeginGroup和GUI.EndGroup来定义群组的开始和结束。
组内成员坐标值均是相对群组左上角来说。(相对位置)
Rect rec5
= new Rect(Screen.width / 2 - 50, Screen.height / 2 - 50, 500, 500);
GUI.BeginGroup(rec5); //开始组
GUILayout.Button("GUILayout控件");
toolBarInt = GUI.Toolbar(rec1, toolBarInt, toolBarString);
GUI.EndGroup(); //结束组
注意:定义组的长宽为(500,500);超出组的内容会被剪切掉
示例代码利用嵌套群组实现了拉动条的效果:
方法是定义了两个Box控件。第一个(红色)固定长宽——外群组。第二个(默认灰色)——内群组,其长度为PlayerEnergy*256,在浮点数PlayerEnergy进行改变的时候,灰色框的长度改变,在红条上覆盖的灰色框长度改变。达到了拉动时覆盖不同的效果。
GUIStyle和GUISkin
GUIStyle:具有自定义长相的GUI控件
public GUIStyle myButtonStyle;
//在OnGUI内:
GUI.Button(rec1, "按钮",myButtonStyle);
——————————————————————————————
GUISkin:可定义具有自己风格的皮肤
在应用自定义皮肤时:
public GUISkin mySkin;
//在OnGUI中:
GUI.skin = mySkin;
GUI.Button(rec1, "按钮"); //会使用mySkin
然后再把MySkin设置为建立好的皮肤muskin
GUILayout的设置
使用GUILayout添加的控件在页面的左上角,按垂直向下方向布局。
如果想要让控件们按水平方向布置:
//想要水平布局的控件前
GUILayout.BeginHorizontal();
//结束水平布局
GUILayout.EndHorizontal();
//开始垂直布局
GUILayout.BeginVertical();
//
如果两个控件贴的太近,则在两个控件之间使用GUILayout.Space:
GUILayout.Button(rec1,"按钮1");
GUILayout.Space(120);
GUILayout.Button(rec2,"按钮2");
如果一个控件太细太扁,想要设置宽度GUILayout.Width:
如滑块:注意:要Layout设置的组件才用Width调整。
hs = GUILayout.HorizontalSlider(hs,0.0,10.0,GUILayout.Width(100));
控件批量放置:GUILayout.BeginArea:类似于GUI.BeginGroup()
GUILayout.Area(rec1);
GUILayout.EndArea();
GUI窗口控件window
GUI.Window用法
public static Rect Window(int id, Rect clientRect,
WindowFunction func, string text);
id:窗口序号;Rect窗口位置;
func窗口回调函数:在窗口回调函数内,加入按钮等控件
public class windowCT : MonoBehaviour
{
public Rect windowRect= new Rect(20,20,500,500);
private void OnGUI(){
windowRect = GUI.Window(0,windowRect,myWindowFun,"我的窗口");
}
void myWindowFun(int winId)
{
Rect buttonRect = new Rect(20, 20, 150, 150);
if (GUI.Button(buttonRect, "窗口内按钮")){
Debug.Log("窗口内按钮按下");
}
}
}
如果想要可拖动的窗口,在回调函数内用函数void DragWindow(Rect position);
Rect为拖动范围:
GUI.DragWindow(buttonRangeRect);
如果需要一个可拖动的开关,可以把window的style设置成开关类型,再设置窗口拖动。