Unity3D中的GUI部分是每帧擦除重绘的,只应该在OnGUI中绘制GUI,每一次在OnGUI方法中声明的变量值都不会保存下来,例如,在Unity中画一个文本编辑框可以调用如下代码:GUILayout.TextField("text");但是运行后会发现,不论我们输入什么都还是只会显示text字符串。这是因为:我们在上一帧中输入的字符串没有被保存,在下一帧中会全部擦除重绘,即重新绘制一个"text"字符串。解决方法:我们可以在该类的成员变量中保存下来输入值,在Start方法中进行初始化 text = GUILayout.TextField(text);接下来介绍几个比较常用的控件。
1.按钮:GUILayout.Button("Hello");该方法返回一个布尔类型值,只有在按下Button抬起的时候返回true,在按下的过程中仍然返回false。
2.重复按钮:GUILayout.RepeatButton("Hello");与Button不同的时,该方法只要是我们按下Button期间会一直返回true,适合做子弹反射按钮。
3.密码框:pwd = GUILayout.PasswordField(pwd,‘*’),第二个参数为掩码字符。
4.Tab页: selectedToolBarId = GUILayout.Toolbar(selectedToolBarId,new string[]{“Tab1”,“Tab2”,“Tab3”}); 返回值为激活的按钮的序号。根据得到标签序号,我们可以绘制相应的Tab页。
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
private int selectedToolBarId;
// Use this for initialization
void Start () {
selectedToolBarId = 0;
}
// Update is called once per frame
void Update () {
}
void OnGUI(){
selectedToolBarId = GUILayout.Toolbar(selectedToolBarId,new string[]{"Tab1", "Tab2", "Tab3"});
switch(selectedToolBarId){
case 0:
GUILayout.Label("selected tab1");//在这里绘制Tab1中的内容
break;
case 1:
GUILayout.Label("selected tab2");//在这里绘制Tab2中的内容
break;
case 2:
GUILayout.Label("selected tab3");//在这里绘制Tab3中的内容
break;
}
}
}
5.单选框Toggle,返回布尔值表示当前选中的情况。
if (isMuted) {
isMuted = GUILayout.Toggle(isMuted, "Yes");
} else {
isMuted = GUILayout.Toggle(isMuted, "No");
}
6.滑动条:纵向, sliderValue = GUILayout.VerticalSlider(sliderValue,0,100);返回值为当前值,第二个参数为最小值,第三个为最大值。 HorizontalSlider()横向。
7.区域Area,相当于一个控件的盒子, Area中的控件跟着Area移动, BeginArea()开始一个区域,参数指定区域的大小和坐标, EndArea()结束区域;
GUILayout.BeginArea (new Rect (50, 50, 100, 100));
GUILayout.Label("Area");
GUILayout.EndArea ();
8.窗口,区域是没有边框和标题的,也不可以拖放。 GUILayout.Window(0, new Rect(50,50,200,200),AddWindow1,“我的窗口”); 第一个参数为窗口的编号,第二个为窗口大小,第三个为void WindowFunction(int windowId)委托,用来绘制窗口内容。
窗口拖拽,在WindowFunction的最后调用GUI.DragWindow()可以启用全屏拖放(给DragWindow传Rect参数可以设定可拖放的区域)。考虑帧刷新的问题,要在OnGUI把Window()的返回Rect保存才可以可拖动,Start()中设定初始位置。
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
private Rect positionRect;
// Use this for initialization
void Start () {
positionRect = new Rect (50, 50, 200, 150);
}
// Update is called once per frame
void Update () {
}
void OnGUI(){
positionRect = GUILayout.Window(0, positionRect, WinFunc1, "Title");
}
void WinFunc1(int id){
GUILayout.Button("WinButton");
GUILayout.Label ("WinLabel");
GUI.DragWindow();
}
}