Unity GUI编程
脚本语言:C#
附上一张图说明Unity GUI编程中可用的控件:(可能有遗漏)
下面列出一些例子来说明:
1、Groups :
在固定Layout模式中起到组织可用项的功能,它让你在屏幕的一个区域中包含多个控件。把定义的控件放在GUI.BeginGroup()和 GUI.EndGroup()这对函数中间,所有控件的位置坐标都以Groups的0坐标为起点,假如更改了group坐标,那么内部的控件也会跟随改变。
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using UnityEngine; using System.Collections; public class Test3 : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnGUI(){ // 屏幕宽度和高度 int screenWidth = Screen.width; int screenHeight = Screen.height; // group组大小 int groundWidth = 120; int groundHeight = 150; // group组初始位置 int groupx = (screenWidth - groundWidth) / 2; int groupy = (screenHeight - groundHeight) / 2; GUI.BeginGroup( new Rect(groupx,groupy,groundWidth,groundHeight)); GUI.Box( new Rect(0,0,groundWidth,groundHeight), "Level Select"); if(GUI.Button( new Rect(10,30,100,30),"Level 1")) Debug.Log("Level 1"); if(GUI.Button( new Rect(10,70,100,30),"Level 2")) Debug.Log("Level 2"); if(GUI.Button(new Rect(10,110,100,30),"Level 3")) Debug.Log("Level 3"); GUI.EndGroup(); // 改变group坐标,group组的位置随之改变 groupx = (screenWidth - groundWidth) / 4; groupy = (screenHeight - groundHeight) / 4; GUI.BeginGroup( new Rect(groupx,groupy,groundWidth,groundHeight)); GUI.Box( new Rect(0,0,groundWidth,groundHeight), "Level Select"); if(GUI.Button( new Rect(10,30,100,30),"Level 1")) Debug.Log("Level 1"); if(GUI.Button( new Rect(10,70,100,30),"Level 2")) Debug.Log("Level 2"); if(GUI.Button(new Rect(10,110,100,30),"Level 3")) Debug.Log("Level 3"); GUI.EndGroup(); } }
2、Button:
用来绘制响应单击事件的按钮;
(1)普通按钮示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using UnityEngine; using System.Collections; public class GUITest1 : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnGUI(){ if ((Time.time % 2) < 1) { if( GUI.Button( new Rect(10,10,120,100),"Unity Button")) print("用户单击了按钮"); } } }
按钮会闪烁显示;
(2)带图标按钮:
对应Main Camera:
Icon是Test2脚本中定义的public Texture 变量,直接把图片拉至Icon处即可产生对应关系。
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using UnityEngine; using System.Collections; public class Test2 : MonoBehaviour { public Texture icon; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnGUI(){ if( GUI.Button( new Rect(20,20,200,120), new GUIContent(icon) ) ) print("用户单击了按钮"); } }
3、Box:
Box控件用来绘制带有边框背景的文字或图片。
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using UnityEngine; using System.Collections; public class GUITest4 : MonoBehaviour { public Texture texture; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnGUI() { // 指定为灰色颜色 GUI.color = Color.gray; GUI.Box (new Rect (10, 10, Screen.width * 0.5f, Screen.height * 0.5f), "This is a title"); GUI.Box (new Rect (150, 170, texture.width/4, texture.height/4), texture); } }
4、Window:
可拖动的窗口;
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using UnityEngine; using System.Collections; public class GUITest5 : MonoBehaviour { public Rect windowRect0 = new Rect(20,20,150,0); // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnGUI() { //渲染窗口ID为0 windowRect0 = GUILayout.Window(0,windowRect0, DoMyWindow,"Draggable Window"); } void DoMyWindow(int windowID) { GUILayout.Label("This is a draggable window!"); } }
5、GUILayout.beginHorizontal和GUILayout.beginVertical
默认情况下,当使用GUILayout函数时所有的视图中的组件都会竖直排列。可以使用GUILayout.BeginHorizontal和GUILayout.EndHorizontall静态函数使控件相邻排放.每出现一次GUILayout.BeginVertical必须有对应的GUILayout.EndVertical与其对应,每出现一次GUILayout.BeginHorizontal则必须有对应的GUILayout.EndHorizontal与其对应;
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using UnityEngine; using System.Collections; public class GUITest6 : MonoBehaviour { private string firstName = "First Name"; private string lastName = "Last Name"; private uint age = 0; private bool submitted = false; private Rect windowRect0; void Start(){ } void Update(){ } void OnGUI() { var screenWidth = Screen.width; var screenHeight = Screen.height; var windowWidth = 300; var windowHeight = 180; var windowX = (screenWidth - windowWidth) / 2; var windowY = (screenHeight - windowHeight) / 2; //将窗口放置到屏幕中间 windowRect0 = new Rect(windowX,windowY,windowWidth,windowHeight); GUILayout.Window(0,windowRect0,UserForm,"User information"); } void UserForm(int windowID) { GUILayout.BeginVertical(); //first name GUILayout.BeginHorizontal(); GUILayout.Label("First Name",GUILayout.Width(80)); firstName = GUILayout.TextField(firstName); GUILayout.EndHorizontal(); //last name GUILayout.BeginHorizontal(); GUILayout.Label("Last Name",GUILayout.Width(80)); lastName = GUILayout.TextField(lastName); GUILayout.EndHorizontal(); //Age GUILayout.BeginHorizontal(); GUILayout.Label("Age",GUILayout.Width(80)); string ageText = GUILayout.TextField(age.ToString()); uint newAge = 0; if( uint.TryParse(ageText, out newAge) ) { age = newAge; } GUILayout.EndHorizontal(); if(GUILayout.Button("Submit")) { submitted = true; } if(GUILayout.Button("Reset")) { firstName = "First Name"; lastName = "Last Name"; age = 0; submitted = false; } if(submitted) { GUILayout.Label("submitted!"); } GUILayout.EndVertical(); } }
6、HorizontalSlider:
水平滚动条
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using UnityEngine; using System.Collections; public class GUITest7 : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } private float masterVolume = 1.0f; private float sfxVolume = 1.0f; void OnGUI() { int groupWidth = 380; int groupHeight = 110; int screenWidth = Screen.width; int screenHeight = Screen.height; int groupX = (screenWidth - groupWidth) / 2; int groupY = (screenHeight - groupHeight) / 2; GUI.BeginGroup( new Rect(groupX,groupY,groupWidth,groupHeight)); GUI.Box( new Rect(0,0,groupWidth,groupHeight),"Audio Settings"); GUI.Label( new Rect(10,30,100,30),"Master Volume"); masterVolume = GUI.HorizontalSlider( new Rect(120,35,200,30), masterVolume,0.0f,1.0f); GUI.Label(new Rect(330,30,50,30),"(" + masterVolume.ToString("f2") + ")"); GUI.Label(new Rect(10,70,100,30),"Effect Volume"); sfxVolume = GUI.HorizontalSlider(new Rect(120,75,200,30),sfxVolume,0.0f,1.0f); GUI.Label(new Rect(330,70,50,30),"(" + sfxVolume.ToString("f2") + ")"); GUI.EndGroup(); } }
7、VerticalSlider:
竖直滚动条
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using UnityEngine; using System.Collections; public class GUITest8 : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } private float[] equalizerValues = new float[10]; void OnGUI() { int groupWidth = 320; int groupHeight = 260; int screenWidth = Screen.width; int screenHeight = Screen.height; int groupX = (screenWidth - groupWidth) / 2; int groupY = (screenHeight - groupHeight) / 2; GUI.BeginGroup(new Rect(groupX,groupY,groupWidth,groupHeight)); GUI.Box(new Rect(0,0,groupWidth,groupHeight),"Equalizer"); for(int i = 0; i < equalizerValues.Length; i++) { equalizerValues[i] = GUI.VerticalSlider(new Rect(i * 30 + 20,30,20,200),equalizerValues[i],0.0f,1.0f); } GUI.EndGroup(); } }
推荐Unity下的2D界面用NGUI来做,更方便。