【unity之UI专题】GUI(IMGUI)详解

news2024/12/27 11:53:09

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unity实战入门

在这里插入图片描述


IMGUI原理


文章目录

    • IMGUI原理
    • 🎶前言
    • 🎶(A)IMGUI工作原理
    • 🎶(B)IMGUI——基本控件
    • 🎶(C)IMGUI基本控件—文本控件
    • 🎶(D)IMGUI基本控件—按钮控件
      • 练习操作
    • 🎶(E)IMGUI基本控件—多选框和单选框
      • 练习操作
    • 🎶(G)IMGUI基本控件—拖动条
      • 练习操作
    • 🎶(F)IMGUI基本控件—输入框
      • 练习操作
    • 🎶(H)IMGUI基本控件—图片绘制
    • 🎶(III)IMGUI——复合控件
    • 🎶(J)IMGUI复合控件—工具栏(标签)
      • 练习操作
    • 🎶(K)IMGUI复合控件—分组和滚动视图
      • 实践练习
    • 🎶(L)IMGUI复合控件—窗口相关
      • 实践练习
    • 🎶(M)IMGUI综合—GuiSkin
    • 🎶(N)IMGUI综合—GUILayout
    • ⭐相关文章⭐


🎶前言

  • IMGUI不会用作游戏的UI开发
  • 会用到游戏的编辑器开发

🅰️ 题单来自:唐老狮


🎶(A)IMGUI工作原理


在这里插入图片描述

在这里插入图片描述


🎶(B)IMGUI——基本控件


在这里插入图片描述
在这里插入图片描述

  • GUIContent -----可以是以下三者的结合
    在这里插入图片描述
    tooltip–鼠标选中后课得到该信息(作为隐藏信息使用)
  • GUIStyle ———全部综合
    1.Nomal ——正常情况
    2.Hover——鼠标停留后
    3.Active——按下之后

🎶(C)IMGUI基本控件—文本控件


在这里插入图片描述


🎶(D)IMGUI基本控件—按钮控件


在这里插入图片描述

  • 点击的逻辑情况 ——> GUI.Button == true ;
    (在原地方点击后松开才算一次点击)

练习操作

  • 用GUI制作一个游戏开始界面,上面有开始游戏,退出游戏,设置等等按钮选项,点击开始游戏可以切换到游戏场景
    在这里插入图片描述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//-------------------------------------
//—————————————————————————————————————
//___________项目:  标签和按钮组件的应用     
//___________功能: 主面板界面 
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class GuiExsi : MonoBehaviour
{
    public Rect RectLabel;
    public Rect RectButton1;
    public Rect RectButton2;
    public Rect RectButton3;
  
    public GUIContent guiContent;
    public GUIStyle guistyle;

    public GUIStyle button1;
    public GUIStyle button2;
    public GUIStyle button3;

    private void OnGUI()
    {
        //------------开始游戏基本画面--------------

        GUI.Label(RectLabel , guiContent ,guistyle);
        if (GUI.Button(RectButton1, "开始游戏", button1))
        {
            SceneManager.LoadScene("simple1");
                
        }
        GUI.Button(RectButton2,"设置", button2);
        GUI.Button(RectButton3, "退出游戏",button3);

        //------------游戏设置面板--------------



    }
}


🎶(E)IMGUI基本控件—多选框和单选框


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习操作

在上一题基础上,弄一个游戏设置面板
有背景音乐的开关和音效的开关
并且点击开始界面的设置可以打开设置面板

  • 设置界面主代码

//-------------------------------------
//—————————————————————————————————————
//___________项目: GUI组件练习 
//___________功能: 设置面板    
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class GUISetPlane : MonoBehaviour
{
    static public  GUISetPlane instance;
    public Rect SetLable1, SetLable2;
    public Rect closeButPos;
    public GUIContent closeButton;

    private  bool swtich1 = true ;
    private  bool swtich2 = true ;
    private  bool swtich3 = true;
    public Rect SetLable3;
    //-----------------------------------

    public void Active()      //让自身激活
    {
        Debug.Log("设置面板已经激活");
        GUISetPlane a = instance.gameObject.GetComponent<GUISetPlane>() as GUISetPlane;
        a.enabled = true;
    }

    public void DisActive()   //让自身失活
    {
        Debug.Log("设置面板已经失活");
        GUISetPlane a = instance.gameObject.GetComponent<GUISetPlane>() as GUISetPlane;
        a.enabled = false ;
    }

    //-------------------------------------
    private void OnGUI()
    {
       
        swtich1 = GUI.Toggle(SetLable1, swtich1, "音效开关");

        swtich2 = GUI.Toggle(SetLable2, swtich2, "音乐开关");

        swtich3 = GUI.Toggle(SetLable3, swtich3, "音乐开关");

        if (GUI.Button(closeButPos, closeButton))
        {
            Debug.Log("已点击关闭窗口");
            DisActive();
            GuiExsi.instance.gameObject.GetComponent<GuiExsi>().enabled = true ;
        }
    }
    private void Awake()
    {
        instance = this;
    }
}

  • 开始界面主代码
//-------------------------------------
//—————————————————————————————————————
//___________项目:   GUI组件练习     
//___________功能:  开始界面    
//___________创建者:秩沅
//_____________________________________
//-------------------------------------

public class GuiExsi : MonoBehaviour
{
    static public GuiExsi instance;
    //---------------------------
    public Rect RectLabel;
    public Rect RectButton1;
    public Rect RectButton2;
    public Rect RectButton3;
    public GUIContent guiContent;
    public GUIStyle guistyle;
    public GUIStyle button1;
    public GUIStyle button2;
    public GUIStyle button3;
    //---------------------------
    public void Active()      //让自身激活
    {
        Debug.Log("主面板已经激活");
        GuiExsi a =instance.gameObject.GetComponent<GuiExsi>() as GuiExsi;
        a.enabled = true ;
    }
    public void DisActive()   //让自身失活
    {
        Debug.Log("主面板已经失活");
        GuiExsi a = instance.gameObject.GetComponent<GuiExsi>() as GuiExsi;
        a.enabled = false;
    }
    private void OnGUI()
    {
        //------------开始游戏基本画面--------------

        GUI.Label(RectLabel , guiContent ,guistyle);
        if (GUI.Button(RectButton1, "开始游戏", button1))
        {
            SceneManager.LoadScene("simple1");               
        }

        GUI.Button(RectButton3, "退出游戏",button3);

       if(GUI.Button(RectButton2, "设置", button2))
        {
            Debug.Log("已点击设置");
            DisActive();
              GUISetPlane.instance.gameObject.GetComponent<GUISetPlane>().enabled = true ;
     
        }   
    }
    private void Awake()
    {
         instance = this;
    }
}


🎶(G)IMGUI基本控件—拖动条


在这里插入图片描述

练习操作

  • 在原有的基础上加入拖动条
    在这里插入图片描述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: 单选框和拖动条的应用 
//___________功能: 音效设置面板    
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class GUISetPlane : MonoBehaviour
{
    //-----------------------------------
    static public  GUISetPlane instance;
    public Rect SetLable1, SetLable2;
    
    public Rect closeButPos;
    public GUIContent closeButton;
    private  bool swtich1 = true ;
    private  bool swtich2 = true ;

    //-----------------------------------

    float ling1 = 1f;
    float ling2 = 1f;
    public Rect roelPso1;
    public Rect roelPso2;
    public Rect texturePos;
    public Texture texture;

    //-----------------------------------

    public void Active()      //让自身激活
    {
        Debug.Log("设置面板已经激活");
        GUISetPlane a = instance.gameObject.GetComponent<GUISetPlane>() as GUISetPlane;
        a.enabled = true;
    }

    public void DisActive()   //让自身失活
    {
        Debug.Log("设置面板已经失活");
        GUISetPlane a = instance.gameObject.GetComponent<GUISetPlane>() as GUISetPlane;
        a.enabled = false ;
    }
    //-------------------------------------
    private void OnGUI()
    {
        GUI.DrawTexture(texturePos, texture);
        swtich1 = GUI.Toggle(SetLable1, swtich1, "音效开关");
        swtich2 = GUI.Toggle(SetLable2, swtich2, "音乐开关");

          ling1 = GUI.HorizontalSlider(roelPso1 , ling1, 1, 0);
          ling2 = GUI.HorizontalSlider(roelPso2 , ling2, 1, 0);

        if (GUI.Button(closeButPos, closeButton))
        {
            Debug.Log("已点击关闭窗口");
            DisActive();
            GuiExsi.instance.gameObject.GetComponent<GuiExsi>().enabled = true ;
        }
    }
    private void Awake()
    {
        instance = this;
    }
}


🎶(F)IMGUI基本控件—输入框


在这里插入图片描述

练习操作

  • 在之前的基础上
    弄一个登陆面板
    有用户名输入和密码输入
    有进入游戏和返回上一级按钮
    点击开始界面中的开始游戏后 进入登陆面板
    输入的 用户名为 admin 密码为8888才能切换场景
    在这里插入图片描述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//-------------------------------------
//—————————————————————————————————————
//___________项目:   输入框的和图片绘制组件的应用
//___________功能:  登录界面面板
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class RegisterIn : MonoBehaviour
{
    public   Rect fieldPos1;
    public   Rect fieldPos2;
    public   Rect texturePos;
    public   Rect buttonPos,buttonPos2;
    public   Rect lable1, lable2;
    public   Texture backGrounp;
    public   GUIContent content,content2;
    public   GUIStyle buttonStyle, buttonStyle2;
    string acount = "";
    string secret = "";
    static public RegisterIn instance;
    //-------------------------------------
    public void Active()      //让自身激活
    { 
        RegisterIn a = instance.gameObject.GetComponent<RegisterIn>() as RegisterIn;
        a.enabled = true;
    }
    public void DisActive()   //让自身失活
    {      
        RegisterIn a = instance.gameObject.GetComponent<RegisterIn>() as RegisterIn;
        a.enabled = false;
    }
    //-------------------------------------
    private void OnGUI()
    {
        GUI.DrawTexture(texturePos, backGrounp);
        acount = GUI.TextField(fieldPos1 , acount);
        secret = GUI.PasswordField(fieldPos2, secret, '*');
        GUI.Label (lable1  ,"用户名");
        GUI.Label (lable2  , "密码");
        //信息正确载入场景
        if ( GUI.Button(buttonPos, content, buttonStyle))
        {
            if( acount == "admin" && secret == "88888")
            {
                SceneManager.LoadScene("simple1");
                Debug.Log("登录成功");
            }          
        }
        //返回到主界面
        if (GUI.Button(buttonPos2, content2, buttonStyle2))
        {
            DisActive();
            GuiExsi.instance.gameObject.GetComponent<GuiExsi>().enabled = true;
        }

    }
    private void Awake()
    {
        instance = this;
    }
}


🎶(H)IMGUI基本控件—图片绘制


在这里插入图片描述
在这里插入图片描述


🎶(III)IMGUI——复合控件


在这里插入图片描述


🎶(J)IMGUI复合控件—工具栏(标签)


在这里插入图片描述
在这里插入图片描述

练习操作

  • 在登录进去的界面后,创建三个信息标签
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:  复合控件工具栏的应用    
//___________功能: 信息显示面板
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class Maincontent : MonoBehaviour
{
    //默认选择第一个表格
    int num = 0;    
    public Rect toolPos2 ;
    public GUIStyle messStyle;
    string[] mess = { "人物信息","装备信息","宠物信息"};
    private void OnGUI()
    {      
          //num =  GUI.Toolbar(toolPos1,num,mess);
          num = GUI.SelectionGrid(toolPos2, num, mess,1, messStyle);

    }

}


🎶(K)IMGUI复合控件—分组和滚动视图


在这里插入图片描述
在这里插入图片描述

实践练习

  • 动态变化滚动视图的内容框长度
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:  复合控件工具栏的应用    
//___________功能: 信息显示面板
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class Maincontent : MonoBehaviour
{
    
    int num = 0; //默认选择第一个表格
    public int viewNumber;
    public Rect toolPos2 ,showPos,contenPos ;
    public Vector2 scorllPos;
    public GUIStyle messStyle;
    string[] mess = { "人物信息","装备信息","宠物信息"};
    string[] messView = {"装备1", "装备2", "装备3", "装备4", "装备5" };
    
    private void OnGUI()
    {      
          //num =  GUI.Toolbar(toolPos1,num,mess);
        num = GUI.SelectionGrid(toolPos2, num, mess,1, messStyle);


        //动态变化内容框的长度——随着内容的数量而改变
        contenPos.height = viewNumber * 30;

        scorllPos = GUI.BeginScrollView(showPos, scorllPos, contenPos);
        
        for (int i = 0; i < viewNumber ; i++)
        {
            GUI.Button(new Rect(0,i * 30, 50, 30),messView[i]);
        }
       
        GUI.EndScrollView();
    }

}


🎶(L)IMGUI复合控件—窗口相关


  • ID相当于窗口唯一识别码
    在这里插入图片描述

实践练习

  • 将游戏退出

在这里插入图片描述


//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 退出确定窗口
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class ExitWindows : MonoBehaviour
{
    static public ExitWindows instance;
    public Rect windowPos;
    //---------------------------
    public void Active()      //让自身激活
    {
        Debug.Log("主面板已经激活");
        ExitWindows a = instance.gameObject.GetComponent<ExitWindows>() as ExitWindows;
        a.enabled = true;
    }
    public void DisActive()   //让自身失活
    {
        Debug.Log("主面板已经失活");
        ExitWindows a = instance.gameObject.GetComponent<ExitWindows>() as ExitWindows;
        a.enabled = false;
    }
    private void OnGUI()
    {
        GUI.ModalWindow(1, windowPos, (int id)=> WinFuction(1) , "提示");
        
    }
    public Rect pos1, pos2, pos3;
    public void WinFuction( int id)
    {
        
        GUI.Label(pos1, "请再次确认");
        if(GUI.Button(pos2, "退出"))
        {
            Application.Quit();
        }
        else if (GUI.Button(pos3, "取消"))
        {
            DisActive();
        }
    }
    
    private void Awake()
    {
        instance = this;
    }
}


🎶(M)IMGUI综合—GuiSkin


在这里插入图片描述

  • 图片中备注来自唐老狮
    在这里插入图片描述

🎶(N)IMGUI综合—GUILayout


在这里插入图片描述


⭐相关文章⭐

⭐【2023unity游戏制作-mango的冒险】-6.关卡设计

⭐【2023unity游戏制作-mango的冒险】-5.攻击系统的简单实现

⭐【2023unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随

⭐【2023unity游戏制作-mango的冒险】-3.基础动作和动画API实现

⭐【2023unity游戏制作-mango的冒险】-2.始画面API制作

⭐【2023unity游戏制作-mango的冒险】-1.场景搭建

⭐“狂飙”游戏制作—游戏分类图鉴(网易游学)

⭐本站最全-unity常用API大全(万字详解),不信你不收藏



你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能产品经理应该怎么做

一、项目与产品的区别 二、项目与产品经理的区别 三、人工智能产品经理的能力模型 产品设计&#xff1a;这个是产品经理的必备技能&#xff0c;包括市场调研、竞品分析、需求分析、产品规划、产品设计、营销策划。需要注意的是&#xff0c;这个里边所讲的产品设计是面向业务层面…

Windows环境Java+VUE项目现场实施总结,JDK安装环境变量配置、Nginx安装、MySQL安装、Redis安装、bat启动脚本编写

前言 项目组成&#xff1a; Java后台接口对外开放接口jar包&#xff08;包含mysql和redis连接&#xff09;windows环境后台启动部署&#xff0c;redis后台启动&#xff1b;vue打包前端静态文件包&#xff1b;使用nginx代理接口静态文件&#xff0c;本地部署加一键启动脚本&…

【Nginx】第二章 Nginx安装

第2章 Nginx安装 2.1 进入nginx官网&#xff0c;下载 nginx news nginx-1.12.2.tar.gz 2.2 需要的安装包 pcre-8.37.tar.gz openssl-1.0.1t.tar.gz zlib-1.2.8.tar.gz nginx-1.12.2.tar.gz 2.3 在线安装nginx 第一步&#xff0c;安装pcre 第一步 联网下载pcre …

IOS自动化测试环境搭建(Python Java)

一、前言 IOS的App自动化测试与Android的一样&#xff0c;也可以用appium来进行。但是IOS自动化依赖苹果的osx系统、Xcode构建等&#xff0c;且封闭的系统需要苹果开发者账号才可以驱动真机。Appium的环境配置有点麻烦&#xff0c;可能大部分时间都在处理各种稀奇古怪的报错&am…

基础的git命令使用

Git区域概念 Git命令行操作 Git单人使用 注意项&#xff08;务必认真阅读&#xff09; Git Bash Here”终端 初始化仓库 提交工作区的内容到版本库 查看版本的记录 查看工作区的状态 版本回退 版本前进 Git远程仓库 克隆项目 推送到远程 拉取远程的更新 Git区域概…

go实现简单的内网穿透

一、内网穿透 1. 内网穿透介绍 内网穿透是一种通过互联网建立远程连接到私有网络&#xff08;内网&#xff09;中设备的技术。通常情况下&#xff0c;内网设备由于位于一个受限制的网络环境中&#xff0c;无法直接从外部访问。内网穿透通过将内网设备的流量转发到公共网络上的…

自动化测试框架[各自动化测试框架大比拼]

目录 Cypress与Selenium/WebDriver Language Bindings/Client Selenium/WebDriver执行慢 Cypress与Selenium/WebDriver比较 Cypress与Karma比较 Cypress与Nightwatch比较 Cypress与Protractor比较 Cypress与TestCafe比较 Cypress和Puppeteer比较 Cypress与Selenium/We…

浅谈智能电容器的结构与功能在电网中的应用 安科瑞 许敏

摘要&#xff1a;近年来&#xff0c;随着我国电力工业的不断发展&#xff0c;大范围的高压输电网络逐渐形成&#xff0c;同时对电网无功功率的要求也日渐严格。电网无功功率不平衡将导致系统电压的巨大波动&#xff0c;严重时会导致用电设备的损坏。因此&#xff0c;研究无功补…

C++与QML 信号与槽交互

一、全局属性 在main.cpp中通过 QQmlApplicationEngine engine 获得全局对象 QQmlApplicationEngine engine; //全局对象 上下文对象 QQmlContext* context engine.rootContext(); //获取屏幕的大小 Screen *screen QGuiApplication::primaryScreen(); …

jquery基础知识整理

写在前面的话&#xff1a;由于公司做的政府网站&#xff0c;需要考虑到兼容ie。所以我们使用jquery解决方案。在一些展示类的、不是一个多网页的整体应用中。我们仍然可以使用jQuery进行开发。 以下是我看慕课网整理的jQuery知识。慕课网课程链接jQuery课程。 以下是我整理的知…

文档识别开发“零门槛”!合合信息智能文字识别技术助力柳州银行“降本增效”

现阶段&#xff0c;越来越多的金融机构将业务转到线上&#xff0c;推出了“零接触”金融服务以提升业务流程效率。在此过程中&#xff0c;智能文字识别技术对提升复杂版式文档录入效率起到了重要作用。 近期&#xff0c;在元脑生态框架下&#xff0c;合合信息将智能文字识别技…

数学建模算法(基于matlab和python)之 三次样条插值与多项式拟合(2/10)

实验目的及要求&#xff1a; 1、会在Matlab平台上进行样条插值&#xff1b; 2、会在Matlab平台上进行最小二乘拟合。 实验内容&#xff1a; 1、利用spline函数绘制【0&#xff0c;10】内步长为1的插值节点处的的样条曲线。 2、根据下列数据三转角方程法构造三次样条函数…

Linux命令大全(面试必备)

前两节有说Git命令&#xff0c;反馈还不错&#xff0c;看来大家对这些必备的命令还挺感兴趣哈&#xff0c;这节就罗列一些Linux必须掌握的命令。 干货满满哦&#xff0c;直接发车... 一、常用的基本命令 1、关机开机 关机 shutdown-h now 立刻关机shutdown-h 3 3分钟后关机…

Java八股文面试(黑马)

Redis篇 数据库的并发不高&#xff0c;请求到了一定的量就会击垮数据库&#xff0c;导致宕机。 大概率是客户端正好在写入数据&#xff0c;sentinel与当前master出现分区 而 重新选举了一个master Mysql篇

IOS 手机抓包 频繁 访问 gateway.icloud.com.cn:443

在抓包的时候&#xff0c;有时候苹果手机在重启后频繁出现gateway.icloud.com.cn:443请求 这种情况需要在手机上进行设置&#xff0c;适用于IOS16.0以上版本&#xff0c;其他版本不清楚&#xff0c;没有尝试过 进入 设置--点击AppleID &#xff0c;进入个人信息页面---点击iCl…

开发工具-网络测试工具 POSTMAN 的脚本使用

开发工具-网络测试工具 POSTMAN 的脚本使用 postman 脚本应用基础设置变量、获取变量示例环境变量的使用测试 发送请求示例常用的变量、方法responseBody 获取响应体内容pm.response 获取响应信息pm.expect() JSON检查cheerio.load() 类似于 jquery 操作 html 元素 POSTMAN 是网…

做独立站要选择什么样的产品呢?这些要点要注意!

跨境圈都在说独立站能不能成功七分靠选品&#xff0c;三分靠运营&#xff0c;可见选品是决定独立站能不能成功的一大关键因素&#xff0c;只有先选定了产品&#xff0c;才能进行店铺装修、物流设置&#xff0c;以及后续的运营工作。 那么独立站的卖家应该如何去选品呢&#xf…

一文搞懂ASCII、Unicode与UTF-8

目录 一、前置知识二、ASCII三、从ASCII到Unicode四、Unicode五、UTF-8六、总结References 一、前置知识 一个字节有8-bit&#xff1b;一个十六进制数占4-bit&#xff0c;故一个字节可以表示为两个十六进制数&#xff08;通常会加上 0x 前缀&#xff09;&#xff1b;十六进制通…

基于Python+OpenCV的视频字符化(深度学习+机器视觉)含全部工程源码

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境OpenCV环境 模块实现1. 视频读取及处理2. 色素块识别与替换3. 视频合成4. 操作系统上的实现 系统测试工程源代码下载其它资料下载 前言 本项目利用 OpenCV 提供的轻量、高效的 C类和 Python 接口&#xff0c;实…

数据平台流量回放最佳实践|精选

1.1 数据平台业务背景 数据平台利用大数据智能分析、数据可视化等技术&#xff0c;对公司内外部经过采集、建设、管理、分析的多源异构数据进行呈现和应用&#xff0c;实现了数据共享、日常报表自动生成、快速和智能分析&#xff0c;深度挖掘数据价值&#xff0c;满足企业各级…