Unity中的UI系统之GUI

news2024/11/18 15:41:35

目录

  • 概述
  • 工作原理和主要作用
  • 基础控件
    • 重要参数及文本和按钮
    • 多选框和单选框
    • 输入框和拖动条
    • 图片绘制和框
  • 复合控件
    • 工具栏和选择网络
    • 滚动视图和分组
    • 窗口
  • 自定义整体样式
    • 自定义皮肤样式

概述

什么是UI系统
UI是User Interface(用户界面)的简称,用户界面就是游戏中的登录,注册,背包,人物等等功能面板,游戏中最多的逻辑功能就是和UI相关的功能。Unity中UI系统可以理解为Unity提供给我们制作UI功能的手段。

工作原理和主要作用

GUI是什么
IMGUI(即时模式游戏用户交互界面),在Unity中一般简称为GUI,它是一个代码驱动的UI系统。
GUI的主要作用
1、作为程序员的调试工具,创建游戏内调试工具
2、为脚本组件创建自定义检视面板
3、创建新的编辑器窗口和工具以拓展Unity本事(一般用作内置游戏工具)
注意:不要用它为玩家制作UI功能。
GUI的工作原理
在继承MonoBehaviour的脚本中的特殊函数里,调用GUI提供的方法,类似生命周期函数。

private void OnGUI()
{
	//在其中书写GUI相关代码即可显示GUI内容
}

注意:
1、它每帧执行,相当于是用于专门绘制GUI界面的函数
2、一般只在其中执行GUI相关界面绘制和操作逻辑
3、该函数在OnDisable之前,LateUpdate之后执行
4、只要是继承Mono的脚本,都可以在OnGUI中绘制GUI

基础控件

重要参数及文本和按钮

GUI控件绘制的共同点
1、他们都是GUI公共类中提供的静态函数直接调用即可
2、他们的参数都大同小异:

  • 位置参数:Rect参数 x y位置 w h尺寸
  • 显示文本:string参数
  • 图片信息:Texture参数
  • 综合信息:GUIContent参数
  • 自定义样式:GUIStyle参数
    3、每一种控件都有多种重载,都是各个参数的排列组合,必备的参数内容,是位置信息和显示信息。

文本控件
1、基本使用

public Texture tex;
GUI.Label(new Rect(0,0,100,20),"控件名");
GUI.Label(new Rect(0,30,100,20),tex);

2、综合使用

public Rect rect;
public GUIContent content;
GUI.Label(rect,content);

3、自定义样式

public GUIStyle style;
GUI.Label(new Rect(0,0,100,20),"控件名",style);

在这里插入图片描述
按钮控件

public Rect btnRect;
public GUIContent btnContent;
public GUIStyle btnStyle;
GUI.Button(btnRect,btnContent,btnStyle);
GUI.RepeatButton(btnRect,btnContent);//长按按钮被点击

多选框和单选框

多选框
1、普通样式

private bool isSel;
isSel = GUI.Toggle(new Rect(0,0,100,30),isSel,"效果开关");

2、自定义样式 显示问题
修改固定宽高:fixedWidth和fixedHeight
修改从GUIStyle边缘内容起始处的空间padding

public GUIStyle style;
GUI.Toggle(new Rect(0,40,100,30),isSel2,"音效开关",style);

单选框
单选框基于多选框实现
关键:通过一个int标识来决定是否选中

private int nowSelIndex = 1;
if(GUI.Toggle(new Rect(0,60,100,30),nowSelIndex == 1,"选项一"))
{
	nowSelIndex = 1;
}
if(GUI.Toggle(new Rect(0,60,100,30),nowSelIndex == 2,"选项二"))
{
	nowSelIndex = 2;
}
if(GUI.Toggle(new Rect(0,60,100,30),nowSelIndex == 3,"选项三"))
{
	nowSelIndex = 3;
}

输入框和拖动条

输入框
1、普通输入

private string inputStr;
inputStr = GUI.TextField(new Rect(0,0,100,30),inputStr);

2、密码输入

private string inputPW;
inputPW = GUI.PasswordField(new Rect(0,50,100,30),inputPW,"*");

拖动条
1、水平拖动条

private float nowValue;
nowValue = GUI.HorizontalSlider(new Rect(0,100,100,50),nowValue,0,1);

2、竖直拖动条

nowValue = GUI.VerticalSlider(new Rect(0,150,50,100),nowValue,0,1);

图片绘制和框

图片绘制

public Rect texPos;
public Texture tex;
public ScaleMode mode = ScaleMode.StretchToFill;
public bool alpha = true;//是否透明
public float wh = 0;
GUI.DrawTexture(texPos,tex,mode,alpha,wh);

ScaleMode:

  • ScaleAndCrop:会通过宽高比计算图片,但是会进行裁剪。
  • ScaleToFit:会自动根据宽高比进行计算,不会拉变形,会一直保持图片完全显示的状态。
  • StretchToFill:始终填充满你传入的Rect范围。

alpha:是用来控制图片是否开启透明通道的。
imageAspect:自定义宽高比,如果不填默认为0,就会使用图片原始宽高。
框绘制

GUI.Box(texPos,"123");

复合控件

工具栏和选择网络

工具栏

private int toolbarIndex = 0;
private string[] toolbarInfos = new string[] {"选项一","选项二","选项三"}
toolbarIndex = GUI.Toolbar(new Rect(0,0,100,30),toolbarIndex,toolbarInfos);

选择网格

private int selGridIndex = 0;
//相对toolbar多了一个参数xCount,代表水平方向最多显示的按钮数量
GUI.SelectionGrid(new Rect(0,50,200,30),selGridIndex,toolbarInfos,3);

滚动视图和分组

分组
用于批量控制控件位置,可以理解为包裹着的控件加了一个父对象,可以通过控制分组来控制包裹控件的位置。

public Rect grouPos;
GUI.BeginGroup(grouPos);
GUI.Button(new Rect(0,0,100,50),"测试按钮");
GUI.EndGroup();

滚动列表

public Rect scPos;//
public Rect showPos;//内容大小
private Vector2 nowPos;//当前位置
nowPos = GUI.BeginScrollView(scPos,nowPos,showPos);
GUI.EndScrollView();

窗口

窗口

GUI.Window(1,new Rect(100,100,200,150),DrawWindow,"测试窗口");
private void DrawWindow(int id)
{
	//添加控件
}

模态窗口
可以让该其他控件不再有用,可以理解为该窗口在最上层,其他按钮点击不到,只能点击该窗口上的控件。

GUI.ModalWindow(2,new Rect(300,100,200,150),DrawWindow,"模态窗口");

拖动窗口

privat Rect dragWinPos = new Rect(400,400,200,150);
dragWinPos = GUI.Window(4,dragWinPos,DrawWindow,"拖动窗口");
private void DrawWindow(int id)
{
	//该API写在窗口函数中调用可以让窗口被拖动
	//传入Rect参数的重载作用事决定窗口哪一部分可以被拖动,默认不填,就是无参重载,默认窗口的所有位置都能被拖动
	GUI.DragWindow();
}

自定义整体样式

自定义皮肤样式

全局颜色

//全局的着色颜色,影响背景和文本颜色
GUI.color = Color.red;
//文本着色颜色
GUI.contentColor = color.yellow;
//背景元素着色,和全局颜色相乘
GUI.backgroundColor = Color.red;

整体皮肤样式

public GUISkin skin;
GUI.skin = skin;

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

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

相关文章

【pytorch】函数记录

你好你好! 以下内容仅为当前认识,可能有不足之处,欢迎讨论! 文章目录 torch.sum()torch.argmax()torch.nn.Parametertorch.unbindtorch.optim.Adam()[^adam]torch.cattorch.unsqueeze()torch.normalize()[^l2]torch.eyetorch.mmto…

网站https证书申请方式

网站HTTPS证书,也称为SSL证书或TLS证书,是一种数字证书,用于在用户浏览器与网站服务器之间建立安全的加密连接。当网站安装了HTTPS证书后,用户访问该网站时,浏览器地址栏会显示为"https://"开头,…

NoSQL--虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先,导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作: 1.1.2.1 点击开启虚拟机: 1.1.2.2 默认选择回车CentOS Linux(3.10.0-1127.e17.x86_64) 7 …

微服务架构 SpringCloud

单体应用架构 将项目所有模块(功能)打成jar或者war,然后部署一个进程--医院挂号系统; > 优点: > 1:部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。 > 2:技术单一:项目不需要复杂的技术栈,往往一套熟悉的…

STM32标准库开发—硬件SPI外设

SPI外设简介 SPI1与SPI2所挂载的总线位置不一样,所以时钟频率也不一样,SPI2挂载在APB1时钟频率为36MHZ是SPI1的一半 I2S是一种音频传输协议,适用于STM32大容量产品 一般来说串口发送数据时是低位先行,SPI通信是高位先行 SPI框图 发…

173基于matlab的经典STAP处理机载雷达信号

基于matlab的经典STAP处理机载雷达信号,空时自适应信号处理的典型算法、滤波器和相关参数的仿真,程序已调通,可直接运行。 173 matlab 空时自适应信号处理 STAR (xiaohongshu.com)https://www.xiaohongshu.com/explore/65d9cf11000000000102b…

谷歌seo推广好还是竞价排名好?

事实上seo跟sem竞价并没有任何冲突,也并没有哪个更好的说法,关键在于理解它们各自的优势与局限性,并根据你的业务,预算来配合 Seo推广的优势在于成本,只要你的网站在搜索结果获得高排名,就能有源源不断的点…

GaN建模:强大但富有挑战性

来源:Modeling GaN: Powerful but Challenging(10年) 文章的研究内容 这篇文章主要研究了氮化镓(GaN)高电子迁移率晶体管(HEMTs)的建模问题。GaN HEMTs是微波频段高功率发射器设计中的关键技术…

azure devops工具实践分析

对azure devops此工具的功能深挖,结合jira的使用经验的分析 1、在backlog的功能描述,可理解为需求项,这里包括了bug,从开发的角度修复bug也是个工作项,所以需求的范围是真正的需求(开发接收到的已经确认的…

【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?

目录 PodKubernetes 网络模型同一Pod上的容器之间进行通信同一Node上的不同Pod之间进行通信不同Node上的Pod之间进行通信Service参考 Pod 首先来回顾一下Pod: Pod 是用于构建应用程序的最小可部署对象。单个 Pod 代表集群中正在运行的工作负载,并封装一…

Spring 事务传播机制

事务传播机制:多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的。 ⽐如:有两个⽅法A,B都被 Transactional 修饰,,A⽅法调⽤B⽅法 A⽅法运⾏时, 会开启⼀个事务。当A调⽤B时, B⽅法本⾝也有事务&#xf…

Golang Base64 编码:Go语言编码全面指南

在编码和解码数据的领域中,Base64作为一种广泛使用的方案脱颖而出,它提供了二进制数据的紧凑表示形式。Golang凭借其强大的标准库,提供了一种无缝且高效的方式来执行Base64编码。在这篇博客文章中,我们将通过Golang的Base64编码能…

mysql修改字段的长度锁表问题

mysql修改字段的长度锁表问题 背景 MySQL(这里指5.6及其后续版本)修改字段的长度锁表会锁表吗?答案是可能会但不一定会 具体原理 MySQL 5.6 及以后版本扩大字段长度 支持 online ddl in-place 模式,而这将不会锁表。varchar 表示…

链表之“带头双向循环链表”

目录 ​编辑 1.链表的分类 2.带头双向循环链表的实现 1.创建结构体 2.创建返回链表的头节点 3.双向链表销毁 4.双向链表打印 5.双向链表尾插 6.双向链表尾删 7.双向链表头插 8.双向链表头删 9.双向链表查找 10.双向链表在pos的前面进行插入 11.双向链表删除pos位…

Java+SpringBoot+Vue+MySQL:狱内罪犯危险性评估系统全栈开发

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

抖音短视频提取器|视频内容批量提取软件

抖音短视频提取器是一款功能强大的工具,旨在解决用户获取抖音视频时需要逐个复制链接、下载的繁琐问题。我们希望用户能够通过简单的关键词搜索,实现自动批量抓取视频,并根据需要进行选择性批量下载。基于C#开发的这款工具不仅支持通过关键词…

进程的通信以及信号的学习

一,进程的通信: 种类:1.管道 2.信号 3.消息队列 4.共享内存 5.信号灯 6.套接字 1.管道: 1.无名管道 无名管道只能用于具有亲缘关系的进程间通信 pipe int pipe(int pipefd[2]); 功能: 创建一个无名管道 …

美创科技荣获“2023年网络安全国家标准优秀实践案例”

近日,全国网络安全标准化技术委员会正式公布2023年网络安全国家标准优秀实践案例获奖名单。 杭州美创科技股份有限公司(以下简称:美创科技)申报的“GB/T 20281-2020《信息安全技术 防火墙安全技术要求和测试评价方法》在政企领域数…

2023年清洁纸品行业分析报告:线上市场销额突破124亿,湿厕纸为重点增长类目

如今,清洁纸品早已经成为人们日常生活的必需品,其市场规模也比较庞大。从销售数据来看,尽管2023年清洁纸品市场整体的销售成绩呈现下滑,但其市场体量仍非常大。 鲸参谋数据显示,2023年京东平台上清洁纸品市场的销量将…

基于springboot+vue的大学城水电管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…