Unity GUI

第一章 基础控件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson1 : MonoBehaviour
{
    
    
    #region 知识点一 GUI是什么
    //全称 即时模式游戏用户交互界面(IMGUI)
    //在unity中一般简称为GUI
    //它是一个代码驱动的UI系统
    #endregion
    #region 知识点二 GUI的主要作用
    //1.作为程序员的调试工具,创建游戏内调试工具
    //2.为脚本组件创建自定义检视面板
    //3.创建新的编辑器窗口和工具以拓展Unity本身(一般用作内置游戏工具)
    //注意:不要用它为玩家制作UI功能
    #endregion
    #region 知识点三 GUI的工作原理
    //在继承MononBehaviour的脚本的特殊函数里
    //调用GUI提供的方法
    //类似于生命周期函数
    private void OnGUI()
    {
    
    
        //在其中书写GUI相关代码 即可显示GUI内容
    }
    //注意:
    //1.它每帧执行 相当于是用于专门绘制GUI界面的hans
    //2.一般只在其中执行GUI相关界面绘制和操作逻辑
    //3.该函数在OnDisable之前 LateUpdate之后执行
    //4.只要是继承Mono的脚本 都可以在OnGUI中绘制GUI
    #endregion
}

第二章 基础控件

一、重要参数及文本和按钮

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson2 : MonoBehaviour
{
    
    
    public Texture tex;
    public Rect rect;
    public Rect rect1;
    public GUIContent content;
    public GUIStyle style;
    public Rect btnRect;
    public GUIContent btncontent;
    public GUIStyle btnstyle;
    private void OnGUI()
    {
    
    
        #region 知识点一 GUI 控件绘制的共同点
        //1.他们都是GUI公共类中提供的静态函数 直接调用即可
        //2.他们的参数都大同小异
        // 位置参数:Rect参数 x y位置 w h尺寸
        // 显示文本:string参数
        // 图片信息:Texture参数
        // 综合信息:GUIContent参数
        // 自定义样式:GUIStyle参数
        //3.每一种控件都有多种重载,都是各个参数的排列组合
        // 必备的参数内容 是 位置信息和显示信息
        #endregion
        #region 知识点二 文本控件
        //基本使用
        GUI.Label(new Rect(0,0,100,50),"lesson2",style);
        GUI.Label(rect, tex);
        //综合使用
        GUI.Label(rect1, content);
        //可以获取当前鼠标或者键盘选中的GUI控件 对应的tooptips信息
        Debug.Log(GUI.tooltip);
        //自定义样式
        #endregion
        #region 知识点三 按钮控件
        GUI.Button(btnRect,btncontent);
        //在按钮范围内 按下鼠标在抬起 才算一次点击 才会返回true
        if (GUI.Button(btnRect, btncontent, btnstyle))
        {
    
    
            //处理我们按钮点击的逻辑
            Debug.Log("按钮被点击");
        }
        //只要在长按按钮范围内 按下鼠标 就会一直返回true
        if (GUI.RepeatButton(btnRect, btncontent))
        {
    
    
            Debug.Log("长按按钮被点击");
        }
        #endregion
    }

}

二、多选框和单选框

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson3 : MonoBehaviour
{
    
    
    public bool isSel;
    public bool isSel2;
    public GUIStyle style;
    private int nowSelIndex = 1;
    private void OnGUI()
    {
    
    
        #region 知识点一 多选框
        #region 普通样式
        isSel = GUI.Toggle(new Rect(0, 0, 100, 30), true, "效果开关");
        #endregion 自定义样式 显示问题
        //修改固定宽高 fixedWidth和fixedHeight
        //修改从GUIStyle边缘到内容起始处的空间 padding
        isSel2=GUI.Toggle(new Rect(0, 40, 100, 30),isSel2,"音效开关",style);
        #endregion
        #region 知识点二 单选框
        //单选框是基于多选框的实现
        if(GUI.Toggle(new Rect(0, 60, 100, 30), nowSelIndex==1, "选项一"))
        {
    
    
            nowSelIndex = 1;
        }
       if( GUI.Toggle(new Rect(0, 100, 100, 30), nowSelIndex ==2, "选项二")){
    
    
            nowSelIndex = 2;
        }
        if (GUI.Toggle(new Rect(0, 140, 100, 30), nowSelIndex == 3, "选项三")){
    
    
            nowSelIndex = 3;
        }
        #endregion
    }

}

三、输入框和拖动条

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson4 : MonoBehaviour
{
    
    
    private string inputStr="请输入内容";
    private string inputPW = "";
    private float nowValue = 0.5f;
  
    private void OnGUI()
    {
    
    
        #region 知识点一 输入框
        #region 普通输入
        inputStr = GUI.TextField(new Rect(0,0,100,30),inputStr,5);
        #endregion

        #region 密码输入
        inputPW = GUI.PasswordField(new Rect(0,50,100,30),inputPW,'*');
        #endregion
        #endregion
        #region 知识点二 拖动条
        #region 水平拖动条
        //当前的值
        //最小值 left
        //最大值 right
        nowValue = GUI.HorizontalSlider(new Rect(0, 100, 100, 50), nowValue, 0, 1);
        Debug.Log(nowValue);
        #endregion
        #region 垂直拖动条
        nowValue = GUI.VerticalSlider(new Rect(0, 150, 50, 100), nowValue, 0, 1);
        #endregion
        #endregion
    }



}

四、图片绘制和框的绘制

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson5 : MonoBehaviour
{
    
    
    public Rect texPos;
    public Texture tex;
    public ScaleMode mode=ScaleMode.StretchToFill;
    public bool alpha=true;
    public float wh=0;
    private void OnGUI()
    {
    
    
        #region 知识点一 图片绘制
        //ScaleMode
        //ScaleAndCrop:会通过宽高比来进行计算 但是 会进行裁剪
        //ScaleToFit:会自动根据宽高比进行计算,不会拉变形,会一直保持图片完全显示的状态
        //StretchToFill:始终填充满你传入的Rect范围
        //aplha 是用来控制图片是否开启透明通道的
        //imageAspect:自定义宽高比 如果不填 默认为0 就会使用 图片原始宽高比
        GUI.DrawTexture(texPos, tex,mode,alpha,wh);
        #endregion
        #region 知识点二 框绘制
        GUI.Box(texPos, "123");
        #endregion
    }
}

第二章 复合控件

一、工具栏和选择网格

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson6 : MonoBehaviour
{
    
    
    private int toolbarIndex = 0;
    private string[] toolbarInfos = new string[] {
    
     "选项一", "选项二", "选项三" };
    private int selGridIndex = 0;
    private void OnGUI()
    {
    
    
        #region 知识点一 工具栏
        toolbarIndex=GUI.Toolbar(new Rect(0, 0, 200, 30),toolbarIndex, toolbarInfos);
        //工具栏可以帮助我们根据不同的返回索引,处理不同的逻辑
        switch (toolbarIndex)
        {
    
    
            case 0:
                break;
            case 1:
                break;
            case 2:
                break;
        }
        #endregion
        #region 知识点二 选择网格
        //相对toolbar多了一个参数 xCount 代表 水平方向最多显示的按钮数量
        selGridIndex= GUI.SelectionGrid(new Rect(0, 50, 200, 60),selGridIndex,toolbarInfos,1);
        #endregion
    }
}

二、滚动视图和分组

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson7 : MonoBehaviour
{
    
    
    public Rect groupPos;
    public Rect scPos;
    public Rect showPos;
    private Vector2 nowPos;
    private string[] strs = new string[] {
    
     "123", "234", "222", "111" };
    private void OnGUI()
    {
    
    
        #region 知识点一 分组
        //用于批量控制控件的位置
        //可以理解为 包裹这的控件加了一个父对象
        //可以通过控制分组来控制包裹控件的位置
        GUI.BeginGroup(groupPos);
        GUI.Button(new Rect(0, 0, 100, 50), "测试按钮");
        GUI.Label(new Rect(0, 60, 100, 20), "label信息");
        GUI.EndGroup();
        #endregion
        #region 知识点二 滚动列表
        nowPos=GUI.BeginScrollView(scPos, nowPos, showPos);
        GUI.Toolbar(new Rect(0,0,300,50),0,strs);
        GUI.Toolbar(new Rect(0,60, 300, 50), 0, strs);
        GUI.Toolbar(new Rect(0,120, 300, 50), 0, strs);
        GUI.Toolbar(new Rect(0,180, 300, 50), 0, strs);
        GUI.EndScrollView();
        #endregion
 
    }

}

三、窗口

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson8 : MonoBehaviour
{
    
    
    private Rect drawWindowPos = new Rect(400, 400, 200, 150);
    private void OnGUI()
    {
    
    
        #region 知识点一 窗口
        //第一个参数id 是窗口的唯一id 不要和别的窗口重复
        //委托参数 是用于 绘制窗口用的函数 传入即可
        GUI.Window(1,new Rect(100,100,200,150),DrawWindow,"测试窗口1");
        //id对于我们来说有一个重要的作用 除了区分不同窗口 还可以在一个函数中去处理多个窗口的逻辑
        //通过id去区分他们
        GUI.Window(2, new Rect(100, 250, 200, 150), DrawWindow, "测试窗口2");
        #endregion
        #region 知识点二 模态窗口
        //模态窗口可以让其他控件不在有用
        //你可以理解为该窗口在最上层 其他按钮都点击不到了
        //只能点击该窗口上的控件
      //  GUI.ModalWindow(3, new Rect(300, 100, 200, 150), DrawWindow, "模态窗口");
        #endregion
        #region 知识点三 拖动窗口
        //位置赋值只是前提
        drawWindowPos = GUI.Window(4, drawWindowPos, DrawWindow, "拖动窗口");
        #endregion
    }

    private void DrawWindow(int id)
    {
    
    
        switch (id)
        {
    
    
            case 1:
                GUI.Button(new Rect(0, 30, 30, 20), "1");
                break;
            case 2:
                GUI.Button(new Rect(0, 30, 30, 20), "2");
                break;
            case 3:
                GUI.Button(new Rect(0, 30, 30, 20), "3");
                break;
            case 4:
                //该API写在窗口函数中调用 可以让窗口被拖动
                //传入Rect参数的重载 作用
                //是决定窗口中哪一部分位置 可以被拖动
                //默认不填就是无参重载 默认窗口的所有位置都能够被拖动
                GUI.DragWindow();
                break;
        }
      
    }
}

四、自定义整体样式
(1)自定义皮肤样式

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson9 : MonoBehaviour
{
    
    
    public GUIStyle style;
    public GUISkin skin;
    private void OnGUI()
    {
    
    
        #region 知识点一 全局颜色
        //全局着色,影响背景和文本颜色
       // GUI.color = Color.red;
        //文本着色颜色
        GUI.contentColor = Color.yellow;
        GUI.Button(new Rect(0, 0, 100, 30), "测试按钮");
        //背景元素着色颜色 会和 全局颜色相乘 得到结果
        GUI.backgroundColor = Color.red;
        GUI.Label(new Rect(0, 50, 100, 30), "测试按钮");
        GUI.color = Color.white;
        GUI.Button(new Rect(0, 100, 100, 30), "测试按钮", style);

        #endregion
        #region 知识点二 全局样式
        GUI.skin = skin;
        //虽然设置了皮肤 但是绘制的时候 如果使用GUIStyle参数 皮肤就没有用了
        GUI.Button(new Rect(0, 0, 100, 30), "测试按钮1");
        GUI.skin = null;
        GUI.Button(new Rect(0, 50, 100, 30), "测试按钮2");
        #endregion
    }
}

(2)GUILayout自动布局

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson10 : MonoBehaviour
{
    
    
    private void OnGUI()
    {
    
    
        #region 知识点一 GUILayout 自动布局
        //主要用于进行编辑器开发 如果用它来做游戏UI不太合适
        GUILayout.BeginArea(new Rect(100, 100, 200, 300));
        GUILayout.BeginHorizontal();
        GUILayout.Button("123");
        GUILayout.Button("122342");
        GUILayout.Button("1DASD23");
        GUILayout.EndHorizontal();
        GUILayout.EndArea();
        #endregion
        #region 知识点二 GUILayoutOption 布局选项
        //控件的固定宽高
        GUILayout.Width(300);
        GUILayout.Height(200);
        //允许控件的最小宽高
        GUILayout.MinWidth(50);
        GUILayout.MinHeight(50);
        //允许控件的最大宽高
        GUILayout.MaxWidth(100);
        GUILayout.MaxHeight(100);
        //允许或禁止水平拓展
        GUILayout.ExpandWidth(true);
        GUILayout.ExpandHeight(false);

        #endregion
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43853077/article/details/126459315
GUI