Unity中的UI系统之GUI

目录

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

概述

什么是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://xiahunao.cn/news/2815441.html

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

相关文章

【基于React实现共享单车管理系统】—项目简介(一)

【基于React实现共享单车管理系统】—项目简介(一) 一、项目整体架构

探索 Sora 背后的核心技术

2024年2月16日,OpenAI发布Sora文生视频模型,一石激起千层浪,迅速刷屏爆火于整个AI圈。一方面,Sora从文本、图像迈向视频大模型,这可以说是通向通用人工智能的里程碑事件;另一方面,训练和推理需求…

基于Python网络爬虫的IT招聘就业岗位数据分析可视化推荐系统

文章目录 基于Python网络爬虫的IT招聘就业岗位数据分析可视化推荐系统项目概述招聘岗位数据爬虫分析系统展示用户注册登录系统首页IT招聘数据开发岗-javaIT招聘数据开发岗-PythonIT招聘数据开发岗-AndroidIT招聘数据开发岗-其它招聘岗位数据分析算法方面运维方面测试方面招聘岗…

Linux学习之system V

目录 一,system V共享内存 快速认识接口 shmget(shared memory get) shmat(shared memory attach) shmdt(shared memory delete) shmctl (shared memory control) 编写代码 综上那么共享内存与管道通信有什么区别? system v消息队列 system v信号…

08 MyBatis之查询专题(返回对象/Map/List封装Map/Map封装Map)+列名与属性名映射的三种方法

准备: INSERT INTO t_car (id, car_num, brand, guide_price, produce_time, car_type) VALUES (165, 6666, 丰田霸道, 32.00, 2020-11-11, 燃油车); INSERT INTO t_car (id, car_num, brand, guide_price, produce_time, car_type) VALUES (166, 1202, 大众速腾, 30.00, 2020…

搜维尔科技:AR/VR技术对制造业劳动力危机的影响

借助 AR/VR 的力量缩小现代制造业的技能差距 数字化转型仍然是企业的首要任务,其许多方面都需要人工干预。然而,推动此类举措所需的技术工人日益短缺。这就造成了我们所说的“制造业劳动力危机”。 了解以下详情: 制造业用工危机正在影响产…

算法沉淀——动态规划之回文串问题(上)(leetcode真题剖析)

算法沉淀——动态规划之回文串问题 01.回文子串02.最长回文子串03.分割回文串 IV04.分割回文串 II05.最长回文子序列06.让字符串成为回文串的最少插入次数 01.回文子串 题目链接:https://leetcode.cn/problems/palindromic-substrings/ 给你一个字符串 s &#xf…

Android 架构MVI、MVVM、MVC、MVP

目录 一、MVC(Model-View-Controller) 二、 MVP(Model-View-Presenter) 三. MVVM(Model-View-ViewModel) 四. MVI(Model-View-Intent) 五.MVI简单实现 先简单了解一下MVC、MVP和…

LabVIEW磁阻自动优化测量系统

LabVIEW磁阻自动优化测量系统 介绍了一种基于LabVIEW开发的磁阻自动优化测量系统,通过自动优化测试分辨率和高度模块化设计,大幅提升磁阻测试的效率和准确性。系统采用功率电源、电磁铁、高分辨率特斯拉计、步进电机转动器、精密电流源与精准电压表等硬…

ruoyi框架学习

RBAC模型 数据字典 拦截器 token没有,submit,request.js中,前端前置拦截器,响应拦截器 后台 注解

Word | 论文使用 Springer LNICST 工具包进行格式化

目录 Step1:下载 Springer LNICST 工具包 Step2:导入宏文件 Step3:处理导入失败(大概意思是这个宏不安全) Step4:导入成功并使用 Step1:下载 Springer LNICST 工具包 会议官网的 SUBMISSIO…

当你使用ChatGPT时,选择合适的提示(prompt)是引导对话方向的关键

马斯克曾说,人生中最重要的事情,就是提出真正的好问题。 因此,我要开始接触某个新领域,并且开始要自主学习的时候,我首先要问自己这个问题: 我为什么要学这个,学这个的目的是为了创造什么&#…

project.config.json 文件内容错误] project.config.json: libVersion 字段需为 string, string

家人们,遇到了一个新的报错 于是从网上找了各种方法,有说把开发者工具关闭重启的,有说开发者工具下载重新下载的,有说开发者工具路径安装得在C盘的,均没有效果 解决方法: 1、运行项目,在开发者…

软件需求分析报告(直接套用)

技术要求 1.1接口要求 1.2可靠性,稳定性,安全性,先进性,拓展性,性能,响应。 2.系统安全需求 2.1物理设计安全 2.2系统安全设计 2.3网络安全设计 2.4应用安全设计 2.5用户安全管理 全套资料过去进主页。

Vue3之属性传值的四种情况

文章目录 Vue3之属性传值的四种情况一、引言二、父组件向子组件传值三、子组件向父组件传值四、祖先组件向后代组件传值五、兄弟组件之间传值 Vue3之属性传值的四种情况 一、引言 在vue3中,组件与组件之间是可以传递属性的,包括三种类型: …

爱旅行平台的设计与实现

爱旅行平台的设计与实现 获取源码——》公主号:计算机专业毕设大全

Oracle中序列

1. Sequence 定义 在Oracle中可以用SEQUENCE生成自增字段。Sequence序列是Oracle中用于生成数字序列的对象,可以创建一个唯一的数字作为主键。 2. 为什么要用 Sequence 你可能有疑问为什么要使用序列? 不能使用一个存储主键的表并每次递增吗&#xf…

java 反射机制 (一)

java反射机制: 即通过外部文件配置,不修改文件源码的情况下,来控制程序,也符合设计模式的OCP原则(开闭原则:不修改源码,扩容原则) Java Reflection 1.反射机制允许程序在执行期间…

Spring中的事务和事务的传播机制

事务是一组操作的集合,不可以被分割。事务会把所有的操作作为一个整体,这组操作要么全部成功,要么全部失败。 事务有三种操作: 开启事务;提交事务;回滚事务。 如果代码的执行逻辑是这样: 开…

dolphinscheduler海豚调度(三)SQL任务

在之前的博文中,我们已经介绍了DolphinScheduler海豚调度的基本概念和模块,安装部署和元数据切换,以及Shell任务的实践。今天,让我们来深入探讨DolphinScheduler中另一种常见的任务类型:SQL任务。 SQL任务是DolphinSc…