写在前面:

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

五、工具栏和选择网格

1、工具栏

使用Unity提供的API:GUI.Toolbar()可以创建一个工具栏。有三个参数是必须传入的:工具栏位置、当前选中的索引、所有选项列表。

位置依然是Rect类型的变量,工具栏位置索引为int类型变量。由于我们需要动态控制工具栏位置索引,因此与之前的API相同,需要创建当前索引变量,第二个参数的位置传入当前变量,并且让这个变量接收函数GUI.Toolbar()的返回值。第三个参数是所有选项列表,可以创建一个string类型的数组,将数组传入。

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

2、选择网格

选择网格与GUI.Toolbar()用法差不多,使用的API是:GUI.SelectionGrid(),前三个参数与GUI.Toolbar()相同,多了第四个参数xCount,表示水平方向最多显示的按钮数量,当前数量为3,所以可能与原来的输出没有区别。

private string[] toolbarInfofs = new string[] {"选项一","选项二","选项三" };
private int selGridIndex = 0;
private void OnGUI()
{//相对toolbar多了一个参数,xCount代表水平方向最多显示的按钮数量selGridIndex = GUI.SelectionGrid(new Rect(0, 50, 200, 60), selGridIndex, toolbarInfofs, 3);
}

数量为3时:

数量为2时:

数量为1时:

六、滚动列表和分组

1、分组

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

提供的API是GUI.BeginGroup()和GUI.EndGroup()。

GUI.BeginGroup()和GUI.EndGroup()的中间写需要批量控制的控件代码,GUI.BeginGroup()中必须传入位置参数,中间的控件位置就是以这个位置为基准的。

public Rect groupPos;private void OnGUI()
{GUI.BeginGroup(groupPos);GUI.Button(new Rect(0, 0, 100, 50), "测试按钮");GUI.Label(new Rect(0, 60, 100, 20), "Label信息");GUI.EndGroup();
}

例如,当位置信息输入如下时:

桌面上的两个控件信息就会这样显示:

再次修改以上的位置信息,这两个控件信息就会批量跟随修改。

2、滚动列表

滚动列表会开辟一个窗口,窗口上会有界面上这样的滚动条:

滚动列表使用的API是GUI.BeginScrollView(),同样有GUI.EndScrollView(),将需要放在滚动列表里的信息批量显示。

其中,GUI.BeginScrollView()有三个必须的参数。第一个参数是滚动列表在屏幕上的显示区域,第二个参数是当前显示的位置(例如在滚动横向或者纵向滚动条后,当前所显示的位置),是个Vector2变量。第三个参数是滚动列表中内容的总大小和位置。当第三个参数大于第一个参数时,就会产生滚动条(可以以Window窗口来类别,假设当前页面大小设置为是500×500(第一个参数)。那么假设此时页面里的内容量为1000×800(第三个参数),大于500×500,就会产生滚动条,滚动着去显示所有内容)

那么,当第三个参数的值小于第一个参数时,就不会产生滚动条。这是因为设置了第四、五个参数,这两个参数默认为false。如果想要第三个参数的值小于第一个参数时也有滚动条,就把它们改为true。

public Rect scPos;
public Rect showPos;
private Vector2 nowPos;
private string[] strs = new string[] {"123","456", "789", "111" };private void OnGUI()
{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();
}

七、窗口

1、窗口

创建窗口使用的API是:GUI.Window(),必要的参数有四个。

第一个参数是窗口唯一的ID,不要和别的窗口重复。假如重复使用就会覆盖掉之前的窗口。第二个参数是位置信息,Rect类型。第三个参数是委托,需要传入一个函数,是用于绘制窗口用的函数(显示窗口内的控件) 重写一个函数传入即可。第四个参数是窗口名。此外,还能传入自定义样式等参数,这里不做演示。

不同的窗口可以传入相同的委托函数,也就是说id除了区分不同窗口,还可以在一个函数中去处理多个窗口,通过id去区分它们。委托函数内可以根据窗口id来执行不同的语句,例如使用Switch case语句。委托函数中可以绘制窗口内的控件,按钮、文字信息、输入框等等。

private void OnGUI()
{GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "测试窗口");GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, "测试窗口2");}private void DrawWindow(int id)
{switch(id){case 1:GUI.Button(new Rect(0, 0, 30, 20), "1");break;case 2:GUI.Button(new Rect(0, 0, 30, 20), "2");break;}}

2、模态窗口

模态窗口除了调用API与普通窗口不同外,参数等都与普通参数相同。它的API为:GUI.ModalWindow()

当模态窗口出现时,其他任何控件都不再会响应你的鼠标,类似一个警告窗口,必须要处理完该窗口的逻辑时才能处理其他窗口。

private void OnGUI()
{GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "测试窗口");GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, "测试窗口2");GUI.ModalWindow(3, new Rect(300, 100, 200, 150), DrawWindow,"模态窗口");
}private void DrawWindow(int id)
{switch(id){case 1:GUI.Button(new Rect(0, 0, 30, 20), "1");break;case 2:GUI.Button(new Rect(0, 0, 30, 20), "2");break;case 3:GUI.Button(new Rect(0, 0, 30, 20), "3");break;}}

3、拖动窗口

拖动窗口就是能被拖动的普通窗口或模态窗口。窗口的API的返回值是一个Rect变量,因此可以效仿之前的控件,创建一个Rect变量接收这个返回值,并将值传入Window函数中。但是仅仅这样设置不能拖动窗口,位置赋值只是前提。

为了让窗口可以被拖动,还需要在委托函数中,处理拖动窗口逻辑处加上:GUI.DragWindow();这个API写在委托函数中,可以让窗口被拖动,传入Rect参数的重载左右是决定窗口中哪一部分位置可以被拖动(例如可以传入位置,指定只有拖动窗口最上面一排时,整个窗口可以被拖动),无参重载默认窗口中所有位置都能被拖动。

private Rect dragWinPos = new Rect(400, 400, 200, 150);private void OnGUI()
{dragWinPos = GUI.Window(4, dragWinPos, DrawWindow, "拖动窗口");
}private void DrawWindow(int id)
{switch(id){case 4:GUI.DragWindow();break;}  
}

八、自定义皮肤样式

1、颜色

(1)全局颜色

全局颜色使用的API是GUI.color = Color.red,这里是将全局颜色定为红色。全局的着色颜色,影响背景和文字颜色,哪怕自定义style颜色也会被改变,全局颜色会在之前颜色的基础上进行叠加。

可以随时在后面更改全局颜色,会作用在更改后的代码上。如下例所示:

 public GUIStyle style;private void OnGUI(){GUI.color = Color.red;GUI.Button(new Rect(0, 0, 100, 30), "测试按钮");GUI.Label(new Rect(0, 50, 100, 30), "测试按钮",style);GUI.color = Color.white;//可以随时改后面的GUI.Button(new Rect(0, 100, 100, 30), "测试按钮",style);}

(2)文本颜色

文本颜色使用的API是GUI.contentColor。文本着色颜色,会和全局颜色相乘,所以最好单独使用。

private void OnGUI(){GUI.contentColor = Color.yellow;GUI.Button(new Rect(0, 0, 100, 30), "测试按钮");GUI.Label(new Rect(0, 50, 100, 30), "测试按钮");}

(3)背景颜色

背景颜色使用的API是 GUI.backgroundColor。背景元素着色颜色,也会和全局颜色相乘。

 public GUIStyle style;private void OnGUI(){GUI.backgroundColor = Color.red;GUI.Label(new Rect(0, 50, 100, 30), "测试按钮");GUI.Button(new Rect(0, 0, 100, 30), "测试按钮",style);}

2、整体皮肤样式

整体皮肤样式使用的API是: GUI.skin。默认情况下为null,使用的是系统自带的那一套皮肤样式。皮肤文件是多个GUI控件的综合体,可以帮助我们整套的设置 自定义样式,相对单个控件要方便一点。

可以在资源文件中创建一个皮肤资源:

如下:

里面是一些熟悉的按键样式更改:

修改后将自己自定义的皮肤样式传入,即可一件设置自定义样式。

 public GUISkin skin;private void OnGUI(){GUI.skin = null;GUI.Button(new Rect(0, 0, 100, 30), "测试按钮");GUI.skin = skin;GUI.Button(new Rect(0, 50, 100, 30), "测试按钮");}

九、自动布局

1、GUILayout自动布局

自动布局的作用是:控件不用传入位置参数,不用我们来布局,会以最长按钮来拉伸,保证对齐。主要用于进行编辑器开发。

自动布局的API是:GUILayout,可以运用这个API来加点使用之前的各个控件,例如GUILayout.Button("123")

private void OnGUI()
{GUILayout.Button("123");GUILayout.Button("1234");GUILayout.Button("12345");
}

可以看到,他为我们自动排布了这三个按钮,并且按钮的大小都是相同的。如果想要横向排布按钮、修改自动布局显示的区域,可以使用GUILayout.BeginHorizontal(),GUILayout.EndHorizontal()与GUILayout.BeginArea(),GUILayout.EndHorizontal()将中间的内容包裹起来,例如:

private void OnGUI()
{GUILayout.BeginArea(new Rect(100, 100, 100, 100));GUILayout.BeginHorizontal();GUILayout.Button("123");GUILayout.Button("1234");GUILayout.Button("12345");GUILayout.EndHorizontal();GUILayout.EndArea();
}

2、布局选项

除了以上基础设置,还有一些布局选项供我们使用,如下,分别可以设置控件的固定宽高、允许控件的最小宽高、允许控件的最大宽高、允许或禁止宽高扩展。

这里说一下允许或禁止宽高的扩展。从第一点可以知道,自动布局会自动帮我们把按钮对齐,它会将所有控件的大小都调整为最大的那个控件大小。如果禁止宽高扩展,自动布局就不会为我们进行大小调整。接下来会有一个使用示例。

private void OnGUI()
{//控件的固定宽高GUILayout.Width(300);GUILayout.Height(200);//允许控件的最小宽高GUILayout.MinWidth(50);GUILayout.MinHeight(50);//允许控件的最大宽高GUILayout.MaxWidth(100);GUILayout.MaxHeight(100);//允许或禁止宽高扩展GUILayout.ExpandWidth(true);GUILayout.ExpandHeight(false);GUILayout.ExpandHeight(true);GUILayout.ExpandWidth(false);
}

布局选项的使用示例,这里仅用禁止宽扩展为案例:

private void OnGUI()
{GUILayout.Button("123",GUILayout.ExpandWidth(false));GUILayout.Button("1234");GUILayout.Button("1234567");
}

补充知识:

在类前加上特性[ExecuteAlways],可以让这个类在编辑器模式下(不运行)也可以执行。

[ExecuteAlways]
public class lession10 : MonoBehaviour
{private void OnGUI(){}
}

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

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

相关文章

Streamlit实现Qwen对话机器人

Web界面 一、Streamlit 是一个用于创建数据科学和机器学习应用的开源前端框架,能够快速将 Python 脚本转化为交互式 Web 应用。通过简单的 Python API 就能构建出交互式的数据应用。 1、主要特点 简单易用:纯 Python 编写代码,API 简洁直观…

Linux-地址空间

目录 1.介绍 2.理解 3.Linux早期的内核调度队列 1.介绍 这是32位的程序空间地址图&#xff1a; 为了更好地理解这段图&#xff0c;我们来写一段代码编译运行&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <std…

**标题:发散创新之力,探索隐私计算的未来**隐私计算,作为当下数字化时代的热门话题,正受

标题&#xff1a;发散创新之力&#xff0c;探索隐私计算的未来 隐私计算&#xff0c;作为当下数字化时代的热门话题&#xff0c;正受到越来越多开发者和从业者的关注。本文将带您走进隐私计算的奇妙世界&#xff0c;探讨其背后的技术原理、应用场景以及发展趋势。 一、隐私计算…

线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉

什么是单例模式&#xff1f;在我们正式讲解单例模式之前&#xff0c;没有了解过的小伙伴可能会有疑问...到底啥叫单例模式&#xff1f;&#xff1f;其实单例模式呢&#xff0c;是我们设计模式中的一种&#xff0c;所谓的设计模式&#xff0c;你可以把它理解为一个模板&#xff…

kubernetes中数据存储etcd

etcd 在 Kubernetes 中的角色核心定位&#xff1a;Kubernetes 的 唯一持久化数据存储&#xff08;一致性数据库&#xff09;。职责&#xff1a; 保存整个集群的期望状态&#xff08;desired state&#xff09;&#xff0c;包括节点信息、Pod 清单、Service 定义、ConfigMap、Se…

Linux crontab定时任务

参考资料 【図解】cronの仕組み定时任务 - crontab解决ubuntu下定时任务不执行问题crontab环境变量问题&#x1f4a5;Linux定时任务功能详解&#xff1a;crontab与at命令应用指南 目录一. 环境准备1.1 wsl开启systemd1.2 开启cron日志二. cron服务管理相关命令2.1 service 的方…

企业频繁收到软件律师函?如何彻底解决这一难题

1. 引言&#xff1a;律师函频发&#xff0c;已成信息化管理的“隐形雷区”在工业制造、芯片、航空航天、船舶制造、医疗器械等高要求行业&#xff0c;软件不仅是研发与生产的关键工具&#xff0c;更是企业数据与知识产权安全的“底座”。然而&#xff0c;不少企业却在日常运营中…

在 macOS 上顺利安装 lapsolver

一、什么是 lapsolver&#xff1f; lapsolver 是一个用于求解线性分配问题&#xff08;Linear Assignment Problem, LAP&#xff09; 的 Python 库。线性分配问题是运筹学中的经典问题&#xff0c;核心是在两个集合&#xff08;如“工人”与“任务”&#xff09;之间找到一组最…

宋红康 JVM 笔记 Day02|JVM的架构模型、生命周期、发展历程

一、今日视频区间 P13-P25 二、一句话总结 JVM的架构模型&#xff1b;JVM的生命周期&#xff1b;JVM发展历程&#xff1b; 三、关键图/命令 3.1 JVM的架构模型Java程序对.class字节码文件进行反编译操作&#xff1a;在idea中先运行需要反编译的代码&#xff0c;找到对应的字节码…

Linux新手上路 | 在Ubuntu上Pluma文本编辑器的安装与基本使用

Linux新手上路 | 在Ubuntu上Pluma文本编辑器的安装与基本使用一、Pluma工具介绍1.1 Pluma 工具概述1.2 主要功能1.3 适用场景二、安装Pluma2.1 安装方法2.2 启动Pluma工具三、汉化方法3.1 安装汉化包3.2 设置系统语言3.3 重新打开Pluma四、基本使用方法4.1 编写文本内容4.2 关键…

React 揭秘:从新手到高手的进阶之路

目录 React&#xff1a;前端开发新宠​ React 初相识​ 什么是 React​ React 的核心特性​ 1.组件化开发 2.虚拟 DOM 与 Diff 算法 单向数据流 搭建 React 开发环境 环境准备​ 创建 React 项目 项目结构解析 React 基础语法与核心概念 JSX 语法​ 基本语法规则…

八股文小记 Servlet 过滤器-Spring MVC 拦截器-Spring AOP 拦截器区别

您对执行机制的洞察非常准确&#xff01;让我们深入分析这三种组件的调用机制及其与 AOP 节点的关系&#xff1a; 一、执行机制的本质区别组件调用机制实现原理Servlet 过滤器递归调用通过 FilterChain.doFilter() 显式递归调用下一个节点Spring MVC 拦截器遍历调用由 HandlerE…

qml 实现数值键盘

import QtQuick 2.0import QtQuick.Layouts 1.12 import"../pad" // PasswordKeyboard.qml import QtQuick 2.12ColumnLayout {id: keyboardspacing: 8// 键盘标题Text {text: "安全输入"font.pixelSize: 16color: "#666"Layout.alignment: Qt.A…

PID控制算法

文章目录引言一、基本原理1.1.简介1.2.开环与闭环1.3.PID 的公式1.3.1.比例项&#xff08;Proportional&#xff09;1.3.2.积分项&#xff08;Integral&#xff09;1.3.3.微分项&#xff08;Differential&#xff09;1.4.连续形式与离散形式的 PID 公式1.4.1.连续形式1.4.2.离散…

MyBatis 动态数据源切换在 Spring Boot 环境下的实现方案

第一章 需求背景与技术选型1.1 多数据源场景概述在大型企业级应用中&#xff0c;单一数据库往往无法满足高并发和多业务线的需求&#xff0c;因此需要引入 多数据源 的架构设计。常见的多数据源场景包括&#xff1a;读写分离、多租户、分库分表以及数据源负载均衡等。读写分离&…

PCA降维理论详解

文章目录一、什么是PCA&#xff1f;二、为什么需要降维&#xff1f;三、PCA的数学原理与详细推导视角一&#xff1a;最大化投影方差&#xff08;Maximizing Variance&#xff09;视角二&#xff1a;最小化重构误差&#xff08;Minimizing Reconstruction Error&#xff09;四、…

Android RxJava变换操作符详解

RxJava作为响应式编程在Android开发中的利器&#xff0c;其强大的变换操作符能够帮助我们优雅地处理数据流。本文将深入讲解RxJava中最常用的变换操作符及其实际应用场景。一、RxJava变换操作符概述变换操作符(Transformation Operators)用于对Observable发射的数据序列进行变换…

开源数据发现平台:Amundsen 快速上手指南

Amundsen 是一个数据发现和元数据引擎&#xff0c;旨在提高数据分析师、数据科学家和工程师与数据交互时的生产力。目前&#xff0c;它通过索引数据资源&#xff08;表格、仪表板、数据流等&#xff09;并基于使用模式&#xff08;例如&#xff0c;查询频率高的表格会优先于查询…

【密码学实战】国密SM2算法介绍及加解密/签名代码实现示例

引言 在信息安全领域&#xff0c;密码算法是数据保护的核心基石。2010 年&#xff0c;中国国家密码管理局发布了 SM2 椭圆曲线公钥密码算法&#xff0c;作为国产密码标准的核心成员&#xff0c;它凭借高效安全的特性&#xff0c;逐步替代 RSA 等国际算法&#xff0c;广泛应用于…

QT开发中如何加载第三方dll文件

文章目录&#x1f527; 一、隐式加载&#xff08;静态链接&#xff09;操作步骤&#xff1a;⚙️ 二、显式加载&#xff08;动态链接&#xff0c;推荐使用QLibrary&#xff09;操作步骤&#xff1a;&#x1f4bb; 三、直接调用Windows API&#xff08;仅Windows&#xff09;⚠️…