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