Unity:GUI笔记(一)——文本、按钮、多选框和单选框、输入框和拖动条、图片绘制和框绘制

写在前面:

写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。主要是唐老师的课程。

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

GUI相关代码需要写在private void OnGUI()中。该函数每帧执行,相当于是专门用于绘制GUI界面的函数,类似生命周期函数,一般只在其中执行GUI相关界面绘制和操作逻辑。该函数在onDisable之前,LateUpdate之后执行。

1、GUI控件绘制的共同点

都是GUI公共类中提供的静态函数,直接调用即可。

参数都大同小异:

1、位置参数:Rect参数 x,y位置 w,h尺寸

2、显示文本:string参数

3、图片信息:Texture参数

4、综合信息:GUIContent参数

5、自定义样式:GUIStyle参数

每一种控件都有多种重载,是各个参数的排列组合。必备的参数内容:位置信息、显示信息

2、文本控件

文本控件可以在game界面输出文字或者图片。基本使用是:GUI.Label(new Rect(0, 0, 100, 20),"hello"),其中,Rect的四个参数分别为:x坐标、y坐标、长、宽。第public二个参数为显示信息,可以为文字也可以为图片。

综合信息content,可以声明public变量,在面板上修改:

其中text是文本信息,image是图片,Tooltip是提示信息。例如可以设置为鼠标悬停在显示信息时打印提示信息。

若是要自定义样式,可以在传入了位置信息、显示信息后再传入style。style信息也是在面板上编辑会更加方便:

这是示例:

public Texture tex;
public Rect rect1;
public GUIContent content;
public GUIStyle style;
private void OnGUI()
{//基本使用//自定义样式styleGUI.Label(new Rect(0, 0, 100, 20),"hello",style);GUI.Label(new Rect(0, 30, 100, 50), tex);//综合使用GUI.Label(rect1, content);Debug.Log(GUI.tooltip);
}

game面板上:

3、按钮控件

按钮控件的使用与文本控件的使用大同小异。传入位置、显示信息等,即可在game屏幕中显示一个按钮。由于按钮控件的返回值是bool,因此可以接收返回值来进行一些逻辑处理。

public Rect buttonrect;
public GUIContent btnContent;
public GUIStyle btnStyle;private void OnGUI()
{if(GUI.Button(buttonrect, btnContent, btnStyle)){Debug.Log("按钮被点击");}if(GUI.RepeatButton(buttonrect,btnContent)){Debug.Log("长按按钮被点击");}
}

这里说一下常用自定义按钮样式,可以在Inspector面板中进行样式修改:

自定义按钮常态样式与常态字体颜色:

修改后:

设置按钮点击样式与点击字体颜色:

设置鼠标悬停时按钮样式与字体颜色:

设置字体样式、大小:

二、多选框和单选框

1、多选框

(1)基础

多选框使用Unity提供的API:GUI.Toggle(),里面传入的参数与上一节的基本相同,只有第二个参数不同。

GUI.Toggle()返回的是bool值,假如此时多选框被点击,就返回true,如果没有被点击返回false。

第一个参数传入多选框的位置,第二个参数需要传入该多选框是否被选中,如果是true就代表该多选框被选中,false就代表没选中。为了动态控制多选框是否被选中,我们可以传入一个变量来决定当前是true还是false。结合GUI.Toggle()的返回值,我们可以直接将这一帧的返回值传入下一帧的GUI.Toggle()中,这样就可以保证下一帧传入的值为true,代码如下:

private bool isSel;
private bool isSel2;
private void OnGUI()
{isSel = GUI.Toggle(new Rect(0, 0, 100, 30), isSel, "效果开关");isSel2 = GUI.Toggle(new Rect(0, 40, 100, 30), isSel2, "音效开关", style);
}

(2)自定义样式

此外需要说明的是,也可以传入style,这里传入style的处理方式和之前不同:

首先需要导入按键图片,也就是可选项的哪个白色小圈。传入的图片可能过大,单独修改图片大小而不碰字体,需要修改:

才会只修改图片的大小,将宽高均修改为20后:

接下来需要单独移动字体而不动图片,需要修改:

修改完成后:

接下来需要修改点击时图片变化,需要在on Normal中传入图片。

再修改一下汉字颜色和字体,自定义样式就完成了:

2、单选框

单选框的实现是基于多选框的。只需要实现,当一个按钮按下后亮起,其他按钮都自动取消按下就可以,可以通过以下代码逻辑实现:

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

三、输入框和拖动条

1、输入框

(1)普通输入

普通的输入框使用的API是:GUI.TextField(),里面必须要传入的参数有两个:位置信息和显示信息。位置信息表示的是输入框的位置,为Rect类型,显示信息是输入框中显示的内容,为string类型。

同之前一样,显示的内容需要实时返回,因此与之前一样,我们可以设置一个变量表示显示信息,第二个参数传入这个变量,GUI.TextField()的返回值也是这个变量接收,这样就可以保证显示信息实时变化。

可以再传入第三个参数,表示最大长度,例如当设置为5时,最多输入5个字符。也可以继续传入输入框样式等。

private string inputStr;private void OnGUI()
{inputStr = GUI.TextField(new Rect(0, 0, 100, 30), inputStr,5);
}

(2)密码输入

密码输入框使用的API是:GUI.PasswordField,里面必须要传入的参数有三个:位置信息、显示信息、密码的覆盖字符。位置信息表示的是输入框的位置,为Rect类型,显示信息是输入框中显示的内容,为string类型。覆盖字符自己可选,例如可以传入字符‘*’,用户输入的内容就会自动变为*

同之前一样,显示的内容需要实时返回,不再解释,同样可以再传入第四个参数,表示最大长度。

private string inputPW;private void OnGUI()
{inputPW = GUI.PasswordField(new Rect(0, 50, 100, 30), inputPW, '*');
}

2、拖动条 

(1)水平拖动条

水平拖动条使用的API是:GUI.HorizontalSlider(),里面必须要传入的参数有四个:位置信息、当前值、最小值、最大值。位置信息表示的是输入框的位置,为Rect类型,当前值是当前拖动条所处的位置,最小值是拖动条最小数值,最大值是拖动条最大数值。

同之前一样,当前值需要实时返回,不再解释,同样可以继续传入样式信息,这里不演示。

private float nowValue = 0.5f;private void OnGUI()
{nowValue = GUI.HorizontalSlider(new Rect(0, 100, 100, 50), nowValue, 0, 1);
}

(2)竖直拖动条

竖直拖动条使用的API是:GUI.VerticalSlider(),除了显示的拖动条是竖向的,其余用法与水平拖动条没有区别

private float nowValue = 0.5f;private void OnGUI()
{nowValue = GUI.VerticalSlider(new Rect(0, 150, 50, 100), nowValue, 0, 1);
}

四、图片绘制和框

1、图片绘制

绘制图片使用的API是:GUI.DrawTexture(),其中必须要传入的参数有两个:图片的位置信息和显示的图片。图片位置信息是Rect型,图片为Texture型。

此外,还有三个较为重要的参数:

1、ScaleMode,有三种:

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

2、alpha:控制图片是否开启透明通道,默认为true开启,false不开启

3、imageAspect:自定义宽高比,如果不填默认为0,就会使用图片原始宽高

public Rect texPos;
public Texture tex;
public ScaleMode mode = ScaleMode.StretchToFill;
public bool alpha = true;
public float wh = 0;private void OnGUI()
{GUI.DrawTexture(texPos, tex, mode, alpha, wh);
}

如果alpha为false:

alpha为true:

2、框绘制

框绘制用的比较少,使用API:GUI.Box(),必须传入位置信息,显示信息,显示信息可以为空。也可以传入可选参数样式等。

public Rect texPos;private void OnGUI()
{GUI.Box(texPos, "");
}

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

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

相关文章

wordpress从wp_nav_menu中获取菜单项

从wp_nav_menu中获取菜单项&#xff0c;然后检查这些菜单项是否对应分类(Category)&#xff0c;并输出这些分类的ID。 以下是完整的代码实现&#xff1a; <?php // 获取指定菜单位置的菜单项 $menu_items wp_get_nav_menu_items(wodepress); // wodepress 是菜单位置的名…

第4章 程序段的反复执行2 while语句P128练习题(题及答案)

&#xff08;&#xff08;1&#xff09;阅读程序#include <bits/stdc.h> using namespace std; //汤永红 int main(){int n,s0;cin >> n;while(n){s s * 10 n % 10;n / 10;}cout << s << endl;return 0; }分别输入&#xff1a;0 1024 1234567890输出…

图解软件系统组成

这是基于 ​​PlantUML​​ 绘制的软件系统组成部分思维导图&#xff0c;聚焦技术路线与文件类型的对应关系&#xff0c;采用分层架构展示核心模块&#xff1a;startmindmap * **软件系统组成部分*** **一、核心技术栈*** 后端技术* 技术路线: Python Web 框架* 文件类型: .py …

【传奇开心果系列】Flet框架实现的多人访问web数据表高并发前后端自定义框架模板

Flet框架实现的多人访问web数据表高并发前后端自定义框架模板一、效果展示截图二、应用场景介绍1. **多用户实时协作**2. **产品管理**3. **数据可视化**三、特色说明1. **实时通信**2. **高性能**3. **用户友好的界面**4. **日志记录**5. **安全性**四、总结五、源码下载地址六…

农业智慧大屏系统 - Flask + Vue实现

下面我将实现一个完整的农业智慧大屏系统&#xff0c;使用Flask作为后端框架&#xff0c;前端使用Vue.js结合ECharts进行数据可视化展示。 设计思路 前端部分&#xff1a; 使用Vue.js构建响应式界面 使用ECharts实现各类农业数据可视化 使用CSS Grid布局实现大屏适配 后端…

Linux中Https配置与私有CA部署指南

Linux中Https配置与私有CA部署指南 一、HTTPS 核心概念特性HTTPHTTPS协议明文传输HTTP SSL/TLS端口80443加密未加密数据加密二、SSL/TLS 握手流程 Client → Server ClientHello&#xff1a;支持哪些版本、支持哪些加密算法&#xff0c;随机生成一组32字节数据 random_c Serve…

【软考架构】主流数据持久化技术框架

JDO与JPA JDO&#xff08;Java Data Objects&#xff09;和JPA&#xff08;Java Persistence API&#xff09;都是Java中用于对象持久化的规范&#xff0c;但它们在设计目标、技术背景和应用场景上存在显著区别。以下是两者的核心对比&#xff1a;1. 规范背景与维护方 JDO&…

服务日志、监控

服务怎么做监控和告警使用 Prometheus 和 Grafana 来实现整个微服务集群的监控和告警&#xff1a;Prometheus&#xff1a;Prometheus 是一个开源的监控系统&#xff0c;具有灵活的数据模型和强大的查询语言&#xff0c;能够收集和存储时间序列数据。它可以通过 HTTP 协议定期拉…

秋招笔记-8.12

我决定从今天开始&#xff0c;在每天的学习内容中加入算法的内容&#xff0c;大致分布时间的话&#xff0c;假设我一天可以学习八个小时&#xff0c;那算法两个小时&#xff0c;八股三个小时&#xff0c;项目三个小时这样的分布差不多吧。之所以还是需要做做笔试一是为了应对面…

【从0带做】基于Springboot3+Vue3的校园表白墙系统

大家好&#xff0c;我是武哥&#xff0c;最近给大家手撸了一个基于SpringBoot3Vue3的校园表白墙系统&#xff0c;可用于毕业设计、课程设计、练手学习&#xff0c;系统全部原创&#xff0c;如有遇到网上抄袭站长的&#xff0c;欢迎联系博主~ 资料获取方式 请点开作者头像看下…

【Linux系列】服务器 IP 地址查询

博客目录一、hostname 命令&#xff1a;简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令&#xff1a;新一代网络配置全能工具基本用法在服务器管理和网络运维中&#xff0c;快速准确地获取服务器的 IP 地址是一项基本但至关重要的技能。无论是进行远程连接、配…

【完美解决】在 Ubuntu 24.04 上为小米 CyberDog 2 刷机/交叉编译:终极 Docker 环境搭建指南

摘要 本文旨在为广大开发者提供一份在非官方推荐的 Ubuntu 24.04 系统上&#xff0c;成功为小米机器狗 CyberDog 2 进行刷机和交叉编译的终极解决方案。通过层层排查 setup.sh 依赖缺失、No devices to flash 以及交叉编译 Segmentation fault 等疑难杂症&#xff0c;我们发现根…

XX生产线MES系统具体实施方案

一、系统架构设计1. 整体架构图2. 技术组件清单模块技术选型部署要求应用服务Spring Boot 3.2 Spring CloudKubernetes Pod (4C8G)实时通信Kafka 3.6 WebSocket3节点集群工业协议Eclipse Milo (OPC UA)独立服务器 (2C4G)数据库PostgreSQL 15 TimescaleDB 2.10SSD存储, 主从复…

Go语言实战案例:使用模板渲染HTML页面

在 Web 开发中&#xff0c;身份验证是一个绕不开的话题。传统的 Session 机制依赖服务器存储用户状态&#xff0c;而在微服务、分布式架构下&#xff0c;这种方式可能会导致状态同步困难。 JWT&#xff08;JSON Web Token&#xff09;是一种无状态的、跨平台的身份验证解决方案…

@RequestMapping接收文件格式的形参(方法参数)

需求&#xff1a;将文件上传到OSS&#xff0c;忽略域名与路径&#xff0c;将文件名以 “img1.png,img2.png,img3.png”保存到数据库中 1、先看结果 后端要接收postman传递的file文件2、SpringBoot接收参数方式 很显然&#xff0c;上面postman上传的地方可以传入多个文件&#x…

【数据分享】2020-2022年我国乡镇的逐日最高气温数据(Shp/Excel格式)

之前我们分享过2020—2022年中国0.01分辨率逐日最高气温栅格数据&#xff08;可以查看之前的文章获悉详情&#xff09;&#xff01;该数据是研究者张凌, 胡英屹等发布在国家冰川冻土沙漠科学数据中心平台上的高分辨最高气温数据。很多小伙伴拿到数据后反馈栅格数据不太方便使用…

为什么C++主函数 main 要写成 int 返回值 | main(int argc, char* argv[]) 这种写法是什么意思?

主函数 main 要写成 int 返回值&#xff1f;main(int argc, char* argv[]) 为什么里面没有 cin 也能读到数据&#xff0c;数据是怎么传进去的&#xff1f;本文将一步步回答这些问题。1. 为什么 main 要写成 intC 标准&#xff08;ISO/IEC 14882&#xff09;规定&#xff0c;mai…

【oracle闪回查询】记录字段短时间被修改的记录

SELECT versions_starttime, versions_endtime, versions_operation, versions_xid, [字段1], [字段2] – 替换为实际字段名 FROM 表名 VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL ‘15’ MINUTE AND SYSTIMESTAMP --15分钟内 WHERE id ‘目标ID’ – 指定记录的唯…

【软考中级网络工程师】知识点之 IP 组播技术:从原理到实战

目录一、IP 组播技术概述1.1 什么是 IP 组播1.2 IP 组播与其他传输方式对比二、IP 组播地址详解2.1 IPv4 组播地址范围及分类2.2 特殊 IPv4 组播地址示例2.3 IPv6 组播地址结构与特点2.4 IP 组播地址与 MAC 地址的映射关系三、IP 组播协议剖析3.1 IGMP 协议深度解析3.2 PIM 协议…

Akamai Bot Manager智能防护体系解析:边缘计算与AI驱动的反爬虫技术

{ “title”: “Akamai Bot Manager智能防护体系解析&#xff1a;边缘计算与AI驱动的反爬虫技术”, “tags”: “Akamai,Bot Manager,边缘计算,反爬虫,CDN安全,机器学习,威胁检测,网络安全”, “description”: “深度剖析Akamai Bot Manager的边缘计算架构、机器学习检测引擎、…