【学习笔记】unity脚本学习(六)【GUI发展历程、IMGUI控件、Layout自动布局】

news2024/11/25 10:47:34

目录

      • unity 界面发展
        • IMGUI
        • NGUI
        • 其他GUI插件
        • uGUI
        • UI 工具包
        • 比较
      • GUI基础
        • GUI静态变量
        • Unity扩展编辑器
        • 屏幕空间的总尺寸Screen.width 和 Screen.height
      • GUI静态函数(GUI控件)
        • Label
          • 图片
        • Box控件
        • Button与RepeatButton
        • TextField
        • TextArea
        • PasswordField
        • 其他控件
      • GUILayout 自动布局UI
          • Layout区域、水平垂直组,FlexibleSpace、space
      • GUISkin、GUIStyle
      • 小结

转载请注明出处: 🔗https://blog.csdn.net/weixin_44013533/article/details/130273811

官网API-GUI
官网GUI手册
b站教程

unity 界面发展

IMGUI

立即模式图形用户界面 (IMGUI) 是一个代码驱动的 UI 工具包,它使用 OnGUI 函数以及实现它的脚本来绘制和管理用户界面。您可以使用 IMGUI 来创建脚本组件的自定义 Inspector,Unity 编辑器的扩展以及游戏内调试显示。不推荐用于构建运行时 UI。

缺点:

  • 非所见即所得
  • 每次渲染都是一个drawCall,容易造成卡顿
    在这里插入图片描述
    好处:
  • 方便测试代码
  • 拓展编辑器

NGUI

在这里插入图片描述

其他GUI插件

在这里插入图片描述

uGUI

Unity 用户界面 (Unity UI) 软件包(也称为 uGUI)是一个较旧的、基于游戏对象的 UI 系统,您可以使用它为游戏和应用程序开发运行时 UI。在 Unity UI 中,即可使用组件和 Game 视图来排列和定位用户界面并设置其样式。它支持高级渲染和文本功能。

UI 工具包

UI 工具包是 Unity 中最新的 UI 系统。它旨在优化跨平台的性能,并基于标准 Web 技术。您可以使用 UI 工具包为 Unity 编辑器创建扩展,并为游戏和应用进程创建运行时 UI

UI 工具包包括:

  • 一个保留模式 UI 系统,包含创建用户界面所需的核心特性和功能。
  • UI 资源类型,受标准 Web 格式(如 HTML、XML 和 CSS)启发。使用它们来实现 UI 的构建和风格。
  • 工具和资源,用于学习使用 UI 工具包创建和调试界面。

Unity 打算让 UI 工具包成为新 UI 开发项目的推荐 UI 系统,但它仍然缺少 Unity UI (uGUI) 和 IMGUI 中的一些功能。

比较

官方手册UI系统对比

由newBing总结自Unity3D编程之NGUI和UGUI比较(2021年):
在这里插入图片描述
强烈推荐↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
啊这,直接刷到一篇博客,我还看啥17年的视频介绍啊,直接看这个博主的UI发展总结,人家在优化上看来颇有研究
UIToolkit下一代UI系统
在这里插入图片描述
沃日真是个大佬,叫宣雨松,07年就来北京打拼。
个人站上也有行业招聘,可以参考参考,uwa行业招聘

GUI基础

即时模式 GUI (IMGUI)是一个完全独立的功能系统,不同于 Unity 基于游戏对象的主 UI 系统。IMGUI 是一个代码驱动的 GUI 系统,主要用作程序员的工具。为了驱动该系统,需在实现脚本上调用 OnGUI 函数

即时模式 GUI 系统常用于:

  • 创建游戏内调试显示和工具。
  • 为脚本组件创建自定义检视面板。
  • 创建新的编辑器窗口和工具以扩展 Unity 本身。

GUI静态变量

  • backgroundColor 用于 GUI 渲染的所有背景元素的全局着色颜色。
  • changed 如果任何控件更改了输入数据的值,则返回 true。
  • color Applies a global tint to the GUI. The tint affects backgrounds and text colors.
  • contentColor 为 GUI 渲染的所有文本着色。
  • depth 当前正在执行的 GUI 行为的排序深度。
  • enabled 是否启用了 GUI?
  • matrix GUI 变换矩阵。
  • skin 要使用的全局皮肤。
  • tooltip 鼠标指针当前悬停在其上或具有键盘焦点的控件的工具提示。(只读)

Unity扩展编辑器

Unity 允许通过自定义 Inspector 和__编辑器窗口__来扩展编辑器,并且您可以通过自定义的__属性绘制器__来定义属性在 Inspector 中的显示方式。
官网手册

一般来说拓展编辑器对于游戏运行效率不是有什么大的帮助,但是有助于开发效率的提高。
Unity拓展编辑器入门指南

Unity本身的功能已经很强大了,但是由于某些项目的特殊需求,需要拓展编辑器来提高工作效率,让程序去代替人工进行一些比较繁琐的操作,减少一些出错的可能性,比如我们可以写一些工具来定制更改动画曲线,也可以写工具来一键打包资源,压缩资源,检测资源冗余,统计资源信息等等。拓展编辑器也可以展示一些效果,比如人物模型的碰撞框可视化,地图网格AI的可视化等等,拓展编辑器也可以送入AssetStore进行售卖,获取经济收益。

Unity编辑器拓展【编辑器简介】

屏幕空间的总尺寸Screen.width 和 Screen.height

可使用 Screen.width 和 Screen.height 属性来获取播放器中可用的屏幕空间的总尺寸。

void OnGUI()
    {
        GUI.Box (new Rect (0,0,100,50), "Top-left");
        GUI.Box (new Rect (Screen.width - 100,0,100,50), "Top-right");
        GUI.Box (new Rect (0,Screen.height - 50,100,50), "Bottom-left");
        GUI.Box (new Rect (Screen.width - 100,Screen.height - 50,100,50), "Bottom-right");
    }

在这里插入图片描述

GUI静态函数(GUI控件)

官网手册:IMGUI 控件类型
在这里插入图片描述

Label

public static void Label (Rect position, string text);
public static void Label (Rect position, Texture image);
public static void Label (Rect position, GUIContent content);
public static void Label (Rect position, string text, GUIStyle style);
在屏幕上创建一个文本或纹理标签。

需要放到OnGUI()中

    public Rect rect1 = new Rect(100,100,100,100);
    public Rect rect2 = new Rect(200,200,100,100);
    public Rect rect3 = new Rect(300,300,100,100);
    public Rect rect4 = new Rect(400,400,100,100);
    public Texture texture2;
    public GUIContent gUIContent3;
    public GUIContent gUIContent4;
    private void OnGUI() {
        //GUI.color = Color.black;//测试tooltip时打开,方便查看提示
        GUI.Label(rect1, "label1");
        GUI.Label(rect2, texture2);
        GUI.Label(rect3, gUIContent3);
        GUI.Label(rect4, gUIContent4);
        GUI.Label( new Rect ( 250, 250, 200, 40), GUI.tooltip);
    }

在这里插入图片描述
注意:
我使用GUI.tooltip时,一开始并没有正常显示,我怀疑官方的“第一人称3D”对鼠标有什么处理,导致“吃鼠标”,所以对tooltip的鼠标悬置提示产生影响。所以我另开一个项目,就能正常显示了。

图片

在这里插入图片描述
如果插入的图片不清晰,需要改变Texture Type

  • texture 更适合作为场景的图层
  • Editor GUI and Legacy GUI:适用于编辑器的GUI或老版本的GUI(适于UI)
  • Sprite 如果用的是新GUI就用这个Sprite

Box控件

public static void Box (Rect position, string text);
public static void Box (Rect position, Texture image);
public static void Box (Rect position, GUIContent content);
在 GUI 层上创建一个框。

private void OnGUI() {
        GUI.Box(rect1,"text");
        GUI.Box(rect2,texture);
    }

在这里插入图片描述

Button与RepeatButton

Button 创建一个单击按钮。当用户单击该按钮时,返回 true
RepeatButton 创建一个只要用户按住就一直处于激活状态的按钮。当用户单击该按钮时,返回 true.

public static bool RepeatButton (Rect position, string text);
public static bool RepeatButton (Rect position, Texture image);
public static bool RepeatButton (Rect position, GUIContent content);
public static bool RepeatButton (Rect position, string text, GUIStyle style);
public static bool RepeatButton (Rect position, Texture image, GUIStyle style);
public static bool RepeatButton (Rect position, GUIContent content, GUIStyle style);
参数

  • position 屏幕上用于按钮的矩形。
  • text 要在按钮上显示的文本。
  • image 要在按钮上显示的 Texture。
  • content 该按钮的文本、图像和工具提示。
  • style 要使用的样式。如果省略,则使用当前 GUISkin 的 button 样式。
    int count_button = 0;
    int count_RepeatButton = 0;
    public Texture texture;
    public GUIStyle style;

    private void OnGUI() {
        bool btn = GUI.Button(new Rect(100,100,100,100),"TEXT");
        bool repeatBtn = GUI.RepeatButton(new Rect(100,200,100,100),texture);
        if(btn) count_button++;
        if(repeatBtn) count_RepeatButton++;
        GUI.Label(new Rect(200,100,100,100),"count_button:" + count_button,style);
        GUI.Label(new Rect(200,200,100,100),"count_RepeatButton:" + count_RepeatButton,style);
    }

在这里插入图片描述

TextField

public static string TextField (Rect position, string text);
public static string TextField (Rect position, string text, int maxLength);
public static string TextField (Rect position, string text, GUIStyle style);
public static string TextField (Rect position, string text, int maxLength, GUIStyle style);

  • position 屏幕上用于文本字段的矩形。
  • text 要编辑的文本。应将该函数的返回值指定给该字符串,如示例中所示。
  • maxLength 字符串的最大长度。如果省略,用户可以键入任意长度的字符串。
  • style 要使用的样式。如果省略,则使用当前 GUISkin 的 textField 样式。

返回编辑后的字符串。

TextField 控件是一个包含文本字符串的交互式可编辑单行字段。

注意text要是变量,且返回赋值给这个变量,否则无法修改文本。

    int a = 0;
    private void OnGUI() {
        GUI.TextField(new Rect(100,100,100,100),(a++).ToString());
    }

在这里插入图片描述

string text;
    private void OnGUI() {
        text = GUI.TextField(new Rect(100,100,100,100),text);
    }

在这里插入图片描述

TextArea

GUI.TextArea与它的区别就是有多行
在这里插入图片描述

PasswordField

PasswordField就是单行密码输入框

string text = "";
    private void OnGUI() {
        text = GUI.PasswordField(new Rect(100,100,100,100),text,"#"[0]);
    }

在这里插入图片描述
注意text这里必须赋初值,不然会空指针异常
在这里插入图片描述

其他控件

public Rect[] area = {
        new Rect(21,1,100,20),
        new Rect(21,36,100,20),
        new Rect(21,74,100,20),
        new Rect(21,144,100,20),
        new Rect(21,165,100,20),
        new Rect(21,300,100,20),
        new Rect(41,40,100,20)
        };
    string text = "this is text field";
    bool toggle = false;
    int toolbar1 = 1;
    int toolbar2 = 1;
    float horizontalValue = 3f;
    float verticalValue = 3f;
    public  Texture texture;
    float slider3 = 3f;
    Vector2 scrollPosition = Vector2.zero;
    Rect scrollArea = new Rect(0,0,220,200);
    public float srollLength = 20f;
    private void OnGUI() {
        // toggle = GUI.Toggle(area[0],toggle,"this is toggle");
        // toolbar1 = GUI.Toolbar(area[1],toolbar1,new string[]{"toolbar_A","toolbar_B","toolbar_C"});
        // toolbar2 = GUI.SelectionGrid(area[2],toolbar2,new string[]{"selection_a","selection_b","selection_c","selection_d"},3);
        // horizontalValue = GUI.HorizontalSlider(area[3],horizontalValue,0f,100f);
        // verticalValue = GUI.VerticalSlider(area[4],verticalValue,1f,100f);
        // GUI.DrawTexture(new Rect(area[3].x,area[3].y+20,horizontalValue,verticalValue),texture);
        slider3 = GUI.HorizontalScrollbar(area[5],slider3,srollLength,0f,10f);
        scrollPosition = GUI.BeginScrollView(area[6],scrollPosition,scrollArea);
        GUI.Button(new Rect(0,0,100,20),"Top-left");
        GUI.Button(new Rect(120,0,100,20),"Top-right");
        GUI.Button(new Rect(0,180,100,20),"Bottom-left");
        GUI.Button(new Rect(120,180,100,20),"Bottom-right");
        GUI.EndScrollView();

        area[0] = GUI.Window(0,area[0],windfinc,"my window");

    }
    void windfinc(int windowID){
        GUI.Button(new Rect(60,50,100,20),"window button");
        GUI.DragWindow();

    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
每个 Window 都有一个 id 编号,并且其内容在一个单独的函数内声明,该函数在 Window 获得焦点时调用。Window 是唯一需要额外函数才能正常工作的控件。必须为 Window 提供 id 编号和要执行的函数名称。

GUILayout 自动布局UI

自动布局控件不需要 Rect() 函数

public string text1 = "button1";
    public string text2 = "button2";
    public string text3 = "button3";
    public string text4 = "button4";
    public float width = 200f;
    public float maxWidth = 200f;
    public float minWidth = 200f;
    public bool expand = false;
    private void OnGUI() {
        GUILayout.Button(text1,GUILayout.Width(width));
        GUILayout.Button(text2,GUILayout.MaxWidth(maxWidth));
        GUILayout.Button(text3,GUILayout.MinWidth(minWidth));
        GUILayout.Button(text4,GUILayout.ExpandWidth(expand));
    }

因为是自动布局,某个组件宽度会影响其他组件。

 void OnGUI () {
        GUILayout.Button ("I am not inside an Area");
        GUILayout.BeginArea (new Rect (Screen.width/2, Screen.height/2, 300, 300));
        GUILayout.Button ("I am completely inside an Area");
        GUILayout.EndArea ();
    }

在这里插入图片描述

Layout区域、水平垂直组,FlexibleSpace、space
public Rect rect = new Rect(0,0,200,200);
    private void OnGUI() {
        GUILayout.BeginArea(rect);
        GUILayout.BeginHorizontal();

        #region vertical_A
        GUILayout.BeginVertical();
        GUILayout.Box("text1");
        GUILayout.Space(20f);
        GUILayout.Box("text2");
        GUILayout.FlexibleSpace();
        GUILayout.Box("text2");
        GUILayout.FlexibleSpace();
        GUILayout.Box("text2");
        GUILayout.FlexibleSpace();
        GUILayout.Box("text2");
        GUILayout.EndVertical();
        #endregion

        #region vertical_B
        GUILayout.BeginVertical();
        GUILayout.Box("text3");
        GUILayout.Box("text4");
        GUILayout.EndVertical();
        #endregion

        GUILayout.EndHorizontal();
        GUILayout.EndArea();

    }

在这里插入图片描述

GUISkin、GUIStyle

GUISkin 是可应用于 GUI 的 GUIStyle 的集合。每种控件 (Control)类型都有自己的样式定义。皮肤 (Skin) 的主要目的将样式应用于整个 UI,而不是应用于单独的控件本身。

GUI Style 是与 UnityGUI 结合使用的自定义属性的集合。单个 GUI Style 定义了单个 UnityGUI 控件的外观。

在这里插入图片描述
详细的还是以后玩uGUI时找插件和素材弄吧。

小结

了解了GUI演变历史,熟悉了IMGUI的各种控件。
uGUI等项目实战的时候再学。

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

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

相关文章

MySql主从复制原理及部署

MySql主从复制 原理: 1、Master节点开启binlog,并将变动记录到binlog中; 2、Slave节点定期探测Master节点的binlog,如有变动,开启I/O线程向Master节点请求二进制事件; 3、Master节点为每一个I/O线程启动…

win10卸载MySQL8.0

停止MySQL服务 shiftctrlesc打开任务管理器 将MySQL服务停止,这里我只有一个MySQL服务,如有多个MySQL服务,也要全部停止掉。 卸载mysql server等设备 控制面板 -》程序 -》 程序和功能,将mysql server等设备卸载掉,好…

SpringCloudAlibaba服务熔断、限流——Sentinel

Sentinel 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 简介 Sentinel是Alibaba公司推出的一个熔断与限流工具,相当于我们之前学习的Hystrix,可以解决服务使用中的各种问题,例如:服务雪崩、服务降…

minigpt4搭建过程记录,简单体验图文识别乐趣

引言 从3月开始,aigc进入了疯狂的开端,正如4月12日无界 AI直播 在《探索 AIGC 与人类合作的无限可能》中关于梳理的时间线一样,aigc的各种产品如雨后春笋般进入了不可逆的态势,里面有句话很形象,人间一日,…

信息收集(四)服务器信息收集

信息收集(一)域名信息收集 信息收集(二)IP信息收集 信息收集(三)端口和目录信息收集 WAF指纹识别 什么是WAF WAF的全称是(Web Application Firewall )Web 应用防火墙用来过滤HTTP…

最新国内免费chatgpt 的试用方法

方式一: 免费账号: 地址:gpt-easy.com 账号test666, 666666 方式二: wheart.cn 每3小时15次调用 方式三: Microsoft Edge 插件,每天30次免费 方式四: wetab插件,多源切换&am…

StarRocks 3.0 集群安装手册

本文介绍如何以二进制安装包方式手动部署最新版 StarRocks 3.0集群。 什么是 StarRocks StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理,就可以…

2023年五月份图形化三级打卡试题

活动时间 从2023年5月1日至5月21日,每天一道编程题。 本次打卡的规则如下: 小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 小朋友做完题目后,截图到朋友圈打卡并把打卡的截图发到活动群…

Android硬件通信之 GPIO通信

一,为什么要和硬件通信 1.1,做软件开发的可能大多只是在手机上做服务器/客户端这种应用,说白了这些只是对数据的处理,对数据做存储和读取,以及分析的工作。 1.2 但随着智能领域的发展,人们已不满足手动去…

医院核心数据库一体化建设实践

建设背景 “以数据为核心资源的数字化时代,正在成为引领和推动新一轮科技革命的核心力量,将会深刻影响卫生健康行业。” 这是四月份发布的《公立医院运营管理信息化功能指引》中对数据重要性的描述。数据库作为数据的载体,支撑着整个业务系…

李清照最经典的10首诗词

在三千年的诗歌艺术中,男人一直是绝对的主角,虽然时常有女诗人,却如流星闪过。 一直到宋代,李清照的横空出世,给文坛带来一股清风。 她被誉为“千古第一才女”,她的诗词可柔美、可刚毅。 有人将她与李煜…

android studio RadioButton单选按钮

1.定义 <!--单选按钮--> <TextViewandroid:layout_marginTop"10dp"android:layout_width"match_parent"android:layout_height"wrap_content"android:text"请选择你的性别&#xff1a;"> </TextView> <RadioGrou…

3年外包终上岸,我只能说这类公司能不去就不去····

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是3年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

广州华锐互动:超写实3d虚拟数字人为多行业场景赋能

超写实3d虚拟数字人是一种高度逼真的虚拟人物形象&#xff0c;其主要是通过计算机技术对人物形象进行建模、渲染和动画制作&#xff0c;达到和真实人物相似的效果。在现代科技的推动下&#xff0c;超写实3d虚拟数字人已经得到广泛应用。 以下是其常见的实用功能&#xff1a; 商…

20230425-VS2019-在线安装C++17

一、软件环境 windows 10 x64 21H2 19044.2846 最后升级时间&#xff1a;2023-04-25 11:19:33 二、下载VS2019 官方下载&#xff1a; 打开官网&#xff1a; https://visualstudio.microsoft.com/zh-hans/vs/older-downloads 展开VS2019&#xff0c;选择【下载】&#xff…

数据流重定向(>,>>)(<,<<)(2>,2>>)

文章目录 数据流重定向什么是数据流重定向标准输出(>,>>)与标准错误输出(2>,2>>)/dev/null垃圾桶黑洞设备与特殊写法标准输入&#xff1a;<与<< 为什么要使用命令输出重定向呢&#xff1f;案例 数据流重定向 数据流重定向由字面意思来看&#xff0…

本地缓存解决方案Caffeine | Spring Cloud 38

一、Caffeine简介 Caffeine是一款高性能、最优缓存库。Caffeine是受Google guava启发的本地缓存&#xff08;青出于蓝而胜于蓝&#xff09;&#xff0c;在Cafeine的改进设计中借鉴了 Guava 缓存和 ConcurrentLinkedHashMap&#xff0c;Guava缓存可以参考上篇&#xff1a;本地缓…

分布式消息队列Kafka(三)- 服务节点Broker

1.Kafka Broker 工作流程 &#xff08;1&#xff09;zookeeper中存储的kafka信息 ​ 1&#xff09;启动 Zookeeper 客户端。 [zrclasshadoop102 zookeeper-3.5.7]$ bin/zkCli.sh ​ 2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2]…

ES6 新特性的let--const 解构赋值--模板字符串--对象相关新特性--箭头函数--综合代码示例

目录 ES6 新特性 ES6 基本介绍 ES6 是什么? let 声明变量 演示 let 的基本使用 注意事项和使用细节 代码演示 : const 声明常量/只读变量 应用实例 注意事项和使用细节 解构赋值 基本介绍 应用实例-数组解构 应用实例-对象解构 模板字符串 基本介绍 应用实例…

一次说透,4大服务性幂等场景架构设计方案!

服务幂等性架构设计 作者: 博学谷狂野架构师GitHub&#xff1a;GitHub地址 &#xff08;有我精心准备的130本电子书PDF&#xff09; 只分享干货、不吹水&#xff0c;让我们一起加油&#xff01;&#x1f604; 防重表实现幂等 对于防止数据重复提交&#xff0c;还有一种解决方案…