当前位置:   article > 正文

【Unity】UI之GUI的使用_unity gui布局

unity gui布局

前言

UI设计也是一个游戏必不可少的组成部分,本文用于介绍UI中的GUI在游戏开发的作用。

先简单了解一下GUI:

GUI 是图形用户界面的首字母缩写,即允许用户通过图形元素与电子设备(如计算机、笔记本电脑、智能手机和平板电脑)进行交互的界面。在人机交互方面,它是软件应用程序编程的重要组成部分,用用户友好的操作取代基于文本的命令。它的目标是为用户提供易于查找、理解和使用的决策点。换句话说,GUI允许您使用鼠标,笔甚至手指控制设备。

创建 GUI 是因为文本命令行界面复杂且难以学习。GUI 进程允许您单击或指向称为图标或小部件的小图片,并在设备上打开命令或功能,例如选项卡、按钮、滚动条、菜单、图标、指针和窗口。它现在是软件应用程序编程中以用户为中心的设计标准。

使用 GUI 的程序称为“GUI 程序”。该程序创建任务或功能的小图片,并等待用户与它们进行交互。用户控制何时以及如何使用它们。要选择功能,用户可以使用键盘、指针设备,例如鼠标、触摸板或触摸屏,具体取决于设备。

一、GUI技术介绍

GUI技术看似成为古老的技术,但是Unity5.x之后并没有取消这种UI传统的技术。Unity4.6出现的新的UI技术称之为UGUI,我们会在之后的课程进行讲解,他的出现主要是为了重新定义UI的技术规范,统一之前UI插件繁多,混杂,标准不统一的混乱局面,大有一统江湖的目的。但是原生的GUI生命力依然旺盛。在一些早期开发的项目,小型游戏依然有其存在的价值,简单易用是它存在的硬道理。

UI是游戏组成的重要部分,游戏的很多操作直接通过UI控制。无论摄像机拍到的图像怎么变幻,GUI永远显示在屏幕上,不受变形,碰撞,光照等信息影响。

写GUI脚本,必须注意两个重要特征:

(1)GUI脚本控件必须定义在脚本文件的OnGUI事件函数中

(2)GUI每一帧都会调用

  1. void Start () {
  2. }
  3. void Update () {
  4. print ("update");
  5. }
  6. void OnGUI()
  7. {
  8. print ("OnGUI");
  9. }

二、常见基础控件使用

GUI基本的控件如下图所示:

  1. public class Demo : MonoBehaviour {
  2. private string _StrText="";
  3. private string _StrPW="";
  4. private int _IntSelectIndex=0;
  5. private bool _BoolCheck1=false;
  6. private bool _BoolCheck2=false;
  7. private float value=0;
  8. private int min=0;
  9. private int max=100;
  10. void OnGUI()
  11. {
  12. GUI.Label (new Rect(0,0,100,30),"I am the Label");
  13. _StrText = GUI.TextField (new Rect(0,50,100,30),_StrText);
  14. _StrPW = GUI.TextField (new Rect (0, 100, 100, 30), _StrPW);
  15. GUI.Button (new Rect(0,150,50,30),”Sure");
  16. _IntSelectIndex=GUI.Toolbar(new Rect(0,200,200,30),_IntSelectIndex,new string[] {"Duty","Equip","Peopel"} );
  17. _BoolCheck1 = GUI.Toggle (new Rect(0,260,100,50),_BoolCheck1,"zhuangbei");
  18. _BoolCheck2 = GUI.Toggle (new Rect(0,300,100,50),_BoolCheck2,"renyuan");
  19. value = GUI.HorizontalSlider (new Rect (0, 350, 200, 50), value, max, min);}
  20. }

三、GUILayout自动布局

前面我们进行布局的时候,会发现每次都需要输入new Rect(),里面包含四个坐标。为了解决这个烦人的问题,Unity公司提供了一个相对简单的布局方案。即每个控件的宽带高度按照一些字体的大小进行统一计算。位置采取靠左对齐,一个控件占据一行的原则。

  1. void OnGUI()
  2. {
  3. GUILayout.BeginArea (new Rect (100, 200, 300, 400));
  4. GUILayout.Label ("I am label");
  5. GUILayout.Label ("hello world");
  6. GUILayout.Label ("Hello Mornig");
  7. GUILayout.EndArea ();
  8. }
  9. GUILayout.BeginArea (new Rect (100, 200, 300, 400));
  10. //相当于布局一个盒子,盒子使用Rect进行定义,如果字体太多,超出范围则不显示。
  11. private bool _BoolDisplay=false;
  12. private bool _BoolDisplayWindow=false;
  13. void OnGUI()
  14. {
  15. if (GUILayout.Button ("Show")) {
  16. GUILayout.Label("I can't show in window");
  17. }
  18. if (GUILayout.Button (" xianshi")) {
  19. _BoolDisplay=true;
  20. }
  21. if (_BoolDisplay) {
  22. GUILayout.Label("I can be show");
  23. }
  24. if (GUILayout.Button ("Show Window")) {
  25. _BoolDisplayWindow=true;
  26. }
  27. if (_BoolDisplayWindow) {
  28. GUILayout.Window(0,new Rect(100,100,200,200),AddWindow,"MyWindow");
  29. }
  30. }
  31. void AddWindow(int winId)
  32. {
  33. if (GUILayout.Button ("Exit")) {
  34. _BoolDisplayWindow=false;
  35. }
  36. }

四、GUI皮肤

1、我们使用GUI.DrawTexture()方法进行贴图的绘制输出,另外,我们还可以结合Resource.Load()类静态方法进行动态提取项目视图中存在的贴图资源。

  1. public class Demo4 : MonoBehaviour {
  2. //public Texture2D Txt2D_bird;
  3. private Texture2D _Txt2D_bird;
  4. // Use this for initialization
  5. void Start () {
  6. _Txt2D_bird = (Texture2D)Resources.Load ("A");
  7. }
  8. // Update is called once per frame
  9. void Update () {
  10. }
  11. void OnGUI()
  12. {
  13. GUI.DrawTexture (new Rect(Screen.width/2-_Txt2D_bird.width/2,Screen.height/2-_Txt2D_bird.height/2,_Txt2D_bird.width,
  14. _Txt2D_bird.height),_Txt2D_bird);
  15. }
  16. }

真正的游戏项目不可能接受丑陋的界面的,那么我们该如何去做呢?Unity已经为我们提供好了一个解决方案,答案就是使用GUISkin

(1)首先项目视图中鼠标右键点击Create->GUI SKin,然后选择CustomStyle进行贴图的赋值,需要几个就进行赋值几个即可。

(2)代码中public GUISkin prijectSkin,进行连接即可。

  1. public class Demo5 : MonoBehaviour {
  2. public GUISkin projectSkin;
  3. public Texture2D Text2D_Btn1;
  4. // Use this for initialization
  5. void Start () {}
  6. // Update is called once per frame
  7. void Update () {
  8. }
  9. void OnGUI()
  10. {
  11. GUI.skin = projectSkin;
  12. GUI.Button(new Rect(0,0,100,100),"",projectSkin.GetStyle("Button1"));
  13. }
  14. }

2、滚动视图的使用

滚动视图是一种非常大众化的界面,大部分游戏都存在滚动视图的影子。

Parameters(参数):

position : Rect —— 滚动视图在屏幕上的矩形位置;

scrollPosition : Vector2 —— 用来显示滚动位置;

viewRect : Rect —— 滚动视图内使用的矩形;

alwayShowHorizontal : boolean —— 可选参数!总是显示水平滚动条,如果设置为false或者不设置时,只用当内矩形区域宽于外矩形区域时才显示;

alwayShowVertical : boolean —— 可选参数!总是显示垂直滚动条,如果设置为false或者不设置时,只用当内矩形区域高于外矩形区域时才显示;

horizontalScrollbar : GUIStyle —— 用于水平滚动条的可选设置,如果不设置,水平滚动条将使用当前的GUISkin;

verticalScrollbar : GUIStyle —— 用于垂直滚动条的可选设置,如果不设置,垂直滚动条将使用当前的GUISkin;

Returns(返回):Vector2 二维向量—— 被修改的滚动位置scrollPosition。返回值应该赋予你的变量;

Description(描述):在GUI中开始一个滚动视图,滚动视图让你在屏幕上产生一个小的区域,使用滚动条可以查看一个大的区域。

 

  1. private string[] infos= new string [5];
  2. 
 Vector2 scrollPosition;
  3. void OnGUI(){
  4. //开始滚动视图
  5. 
 scrollPosition = GUI.BeginScrollView(

  6. new Rect(10,10,400,400),

  7. scrollPosition,new Rect(10,10,700,700)

  8. ,false,false);
  9. //标签内容
  10. 
 GUI.Label(new Rect(10,10,770,40),infos[0]);
  11. 
 GUI.Label(new Rect(10,50,770,40),infos[1]);
  12. 
 GUI.Label(new Rect(10,90,770,40),infos[2]);
  13. 
 GUI.Label(new Rect(10,130,770,60),infos[3]);
  14. 
 GUI.Label(new Rect(10,190,770,40),infos[4]);
  15. 

 //结束滚动视图
  16. 
 GUI.EndScrollView();
  17. }

3、网格布局的使用

  1. for (int i = 0; i < 5; i++) {

  2. for (int j = 0; j < 5; j++) {
  3. if (GUI.Button (new Rect (100 * j, 100 * i,80, 80),"", mySkin.GetStyle ("Coin1")))
  4. {
  5. 
 ButtonClicked (i * 5 + j);

  6. }

  7. }
  8. 
 }
  9. void ButtonClicked(int tag){

  10. print (tag);

  11. }

4、游戏暂停与继续

  1. public class NewBehaviourScript : MonoBehaviour {
  2. 

 public float moveSpeed = 2.0f;
  3. 
 
void Update ()

  4. {

  5. transform.Translate (new Vector3(0,0,
moveSpeed* Time.deltaTime));

  6. }

  7. void OnGUI ()

  8. {

  9. if (GUI.Button (new Rect (140, 0, 100, 50), "暂停")) {

  10. Time.timeScale = 0;

  11. }

  12. if (GUI.Button (new Rect (280, 0, 100, 50), "继续")) {

  13. Time.timeScale = 1;

  14. }
  15. 
 }

  16. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/122444
推荐阅读
相关标签
  

闽ICP备14008679号