三分之十的菜鸟unity学习小记(四)GUI用户界面


在这里插入图片描述

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。
其他常用控件:

  1. Label
    如上所述:GUI.Label(rec,"我是标签"),效果为在界面上显示一行字

  2. Button

  3. RepeatButton
    与Button的区别在于,这个是按住按钮,按钮内指令重复执行(而Button是释放后执行)

  4. 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("用户单击");
            }
    

    在这里插入图片描述

    1. Toggle 开关
    toogleBool = GUI.Toggle(rec, toggleBool, "Toggle");	
    //toggleBool为bool类型
    
    1. HorizontalSlider水平滑块
    hs = GUI.HorizontalSlider(rec1, hs, 0, 10);		
    //hs为float类型,0起始点位置,10终止点位置
    //返回的hs是滑块在滑动条上的位置
    

    要想要实现各个控件位置关联,比如说滑块动的时候按钮也随着动,那更改按钮Rect的位置就行,比如:(10*hs,10,20,100)这种

  5. Box 平平无奇文本框

GUI复杂控件

  1. 工具条控件: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);
        }
    
    }
    }
    
    1. 选择网格控件:SelectionGrid
    int selectGridInt = 0;
    string[] SelectString = { "Sec1", "Sec2", "Sec3" };
    //在OnGUI中:
    selectGridInt 
    = GUI.SelectionGrid(rec2, selectGridInt, SelectString,2);
    

    selectGridInt还是用来跟踪当前被选中的按钮的索引数值。
    2定义了网格的列数。

    1. 检测控件更新: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设置成开关类型,再设置窗口拖动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值