Unity 编辑器篇|(五)编辑器拓展GUILayout类 (全面总结 | 建议收藏)

2024-01-15 13:44

本文主要是介绍Unity 编辑器篇|(五)编辑器拓展GUILayout类 (全面总结 | 建议收藏),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1. 前言
  • 2. 参数
  • 3. 功能
    • 3.1 按钮:Button、RepeatButton
    • 3.2 文本:Label、TextArea、TextField、PasswordField
    • 3.3 工具栏:Toolbar
    • 3.4 切换框:Toggle
    • 3.5 滚动条:HorizontalScroll 、VerticalScroll
    • 3.6 滑条:HorizontalSlider、VerticalSlider
    • 3.7 自动布局框:Box
    • 3.8 布局:BeginHorizontal、EndHorizontal、BeginVertical、EndVertical
    • 3.9 滑动布局:ScrollView
    • 3.10 空白间隔:Space
    • 3.11 浮动窗口:Window
    • 3.12 GUILayoutOption
  • 4. 其他

1. 前言

  • GUILayout 类是 Unity GUI 的接口,并且具有自动布局功能。使用 IMGUI 系统时,可使用两种不同的模式来排列和组织 UI:固定布局模式和自动布局模式。不必使用一种布局模式来替代另一种布局模式,可在同一OnGUI()函数中同时使用这两种模式。
  • 当有预先设计好的界面可供使用时,采用固定布局比较合理。如果预先不知道需要多少元素,或者不想费心进行每个控件的手动定位,则采用自动布局比较合适。例如,如果要基于保存游戏文件创建大量不同的按钮,但无法准确知道要绘制多少按钮,这种情况下采用自动布局可能会更加合理。具体实际上取决于游戏设计以及所需的界面呈现方式。
  • 使用自动布局时有两个主要的不同之处:
    • 使用 GUILayout 而不是 GUI
    • 自动布局控件不需要 Rect() 函数

2. 参数

静态函数描述
BeginArea在一个固定的屏幕区域中开始 GUI 控件的 GUILayout 块。
BeginHorizontal开始一个水平控件组。
BeginScrollView开始一个自动布局的滚动视图。
BeginVertical开始一个垂直控件组。
Box创建一个自动布局框。
Button创建一个单击按钮。
EndArea闭合以 BeginArea 开始的 GUILayout 块。
EndHorizontal闭合以 BeginHorizontal 开始的组。
EndScrollView结束通过 BeginScrollView 调用开始的滚动视图。
EndVertical闭合以 BeginVertical 开始的组。
ExpandHeight传递给控件以允许或禁止垂直扩展的选项。
ExpandWidth传递给控件以允许或禁止水平扩展的选项。
FlexibleSpace插入灵活的空白元素。
Height传递给控件以使其具有绝对高度的选项。
HorizontalScrollbar创建一个水平滚动条。
HorizontalSlider用户可以拖动的水平滑动条,用于在最小值和最大值之间更改某值。
Label创建一个自动布局标签。
MaxHeight传递给控件以指定最大高度的选项。
MaxWidth传递给控件以指定最大宽度的选项。
MinHeight传递给控件以指定最小高度的选项。
MinWidth传递给控件以指定最小宽度的选项。
PasswordField创建一个可让用户输入密码的文本字段。
RepeatButton创建一个重复按钮。只要用户按住鼠标,该按钮就返回 true。
SelectionGrid创建一个选择网格。
Space在当前布局组中插入空白元素。
TextArea创建一个可供用户编辑字符串的多行文本字段。
TextField创建一个可供用户编辑字符串的单行文本字段。
Toggle创建一个打开/关闭的开关按钮。
Toolbar创建一个工具栏。
VerticalScrollbar创建一个垂直滚动条。
VerticalSlider用户可以拖动的垂直滑动条,用于在最小值和最大值之间更改某值。
Width传递给控件以使其具有绝对宽度的选项。
Window创建一个对自身内容进行自动布局的弹出窗口。

3. 功能

3.1 按钮:Button、RepeatButton

  • Button:创建一个单击按钮,有不少重载参数:
    • text:按钮上显示的文本。
    • image:要在按钮上显示的纹理。
    • content:该按钮的文本、图像和工具提示,是GUIContent类。
    • style:要使用的样式,默认是当前在用的样式。
    • options:一个布局选项列表,用于指定额外的布局属性,此处传递的值会覆盖style,本质是包含枚举的类。
  • RepeatButton:创建一个重复按钮。只要用户按住鼠标,该按钮就返回 true,参数与Button类似。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{void OnGUI(){if (GUILayout.Button(" Button")){Debug.Log("Clicked Button");}if (GUILayout.RepeatButton(" RepeatButton")){Debug.Log("Clicked RepeatButton");}}
}

1

3.2 文本:Label、TextArea、TextField、PasswordField

  • Label:创建一个自动布局标签。
  • TextArea:创建一个可供用户编辑字符串的多行文本字段。
  • TextField:创建一个可供用户编辑字符串的单行文本字段。
  • PasswordField :创建一个可让用户输入密码的文本字段。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{public Texture2D textureToDisplay;public string fieldToEdit = "Hello World";public string areaToEdit = "Hello World\nI've got 2 lines...";public string passwordToEdit = "My Password";void OnGUI(){//LabelGUILayout.Label("Hello World!");GUILayout.Label(textureToDisplay);//TextFieldfieldToEdit = GUILayout.TextField(fieldToEdit, 25);//TextAreaareaToEdit = GUILayout.TextArea(areaToEdit, 200);//PasswordFieldpasswordToEdit = GUILayout.PasswordField( passwordToEdit, "*"[0], 25);}
}

2

3.3 工具栏:Toolbar

  • Toolbar:创建一个工具栏。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{int toolbarInt = 0;string[] toolbarStrings = { "Toolbar1", "Toolbar2", "Toolbar3" };void OnGUI(){toolbarInt = GUILayout.Toolbar(toolbarInt, toolbarStrings);}
}

2

3.4 切换框:Toggle

  • Toggle:创建一个打开/关闭的开关按钮。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{bool toggleTxt = false;void OnGUI(){toggleTxt = GUILayout.Toggle(toggleTxt, "A Toggle text");}
}

3

3.5 滚动条:HorizontalScroll 、VerticalScroll

  • HorizontalScroll :创建一个水平滚动条。
  • VerticalScroll:创建一个垂直滚动条。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{float vSbarValue;float hSbarValue;void OnGUI(){vSbarValue = GUILayout.VerticalScrollbar(vSbarValue, 1.0f, 10.0f, 0.0f);hSbarValue = GUILayout.HorizontalScrollbar(hSbarValue, 1.0f, 0.0f, 10.0f);GUILayout.Label("This is a text that makes space");}
}

4

3.6 滑条:HorizontalSlider、VerticalSlider

  • HorizontalSlider :用户可以拖动的水平滑动条,用于在最小值和最大值之间更改某值。
  • VerticalSlider:用户可以拖动的垂直滑动条,用于在最小值和最大值之间更改某值。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{float vSliderValue = 0.0f;float hSliderValue = 0.0f;void OnGUI(){vSliderValue = GUILayout.VerticalSlider(vSliderValue, 10.0f, 0.0f);hSliderValue = GUILayout.HorizontalSlider(hSliderValue, 0.0f, 10.0f);GUILayout.Label("This is a text that makes space");}
}

5

3.7 自动布局框:Box

  • Box :创建一个自动布局框。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{Texture tex;void OnGUI(){if (!tex){Debug.LogError("Missing texture, assign a texture in the inspector");}GUILayout.Box(tex);GUILayout.Box("This is a sized label");}
}

6

3.8 布局:BeginHorizontal、EndHorizontal、BeginVertical、EndVertical

  • BeginHorizontal:开始一个水平控件组。
  • EndHorizontal:闭合以 BeginHorizontal 开始的组。
  • BeginVertical:开始一个垂直控件组。
  • EndVertical:闭合以 BeginVertical 开始的组。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{void OnGUI(){GUILayout.BeginHorizontal();GUILayout.Button("水平按钮1");GUILayout.Button("水平按钮2");GUILayout.EndHorizontal();GUILayout.BeginVertical();GUILayout.Button("垂直按钮1");GUILayout.Button("垂直按钮2");GUILayout.EndVertical();}
}

6

3.9 滑动布局:ScrollView

  • ScrollView方法也分为BeginScrollView和EndScrollView,他需要传入至少一个参数Vector2来记录自己滑动到什么地方了。和其他方法不一样的是,如果不给他加限制条件,他会把全部内容物大小计算出来然后拓展面板长度,也就是没有滑动效果。所以我们需要用一些方法来限制他。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{private Vector2 scrollViewRoot;void OnGUI(){//如果不加以限制,会导致面板强制拉伸300长度,按钮全部放出来scrollViewRoot = GUILayout.BeginScrollView(scrollViewRoot, GUILayout.Width(200), GUILayout.Height(200));GUILayout.Button("1", GUILayout.Height(100));GUILayout.Button("2", GUILayout.Height(100));GUILayout.Button("3", GUILayout.Height(100));GUILayout.EndScrollView();}
}

7

3.10 空白间隔:Space

  • Space方法在当前布局组中插入空白元素,非常简单,没有任何重载构造函数,只需要传入空白长度就能用了。
    因为太简单了就不演示了,一般它是拿来美观或者搭配Area使用的。当然,如果它在水平的元素中,自身也会变成水平的空白块。

3.11 浮动窗口:Window

  • Window:创建一个对自身内容进行自动布局的弹出窗口。
using UnityEngine;public class GUILayoutExample : MonoBehaviour
{Rect windowRect = new Rect(20, 20, 120, 50);void OnGUI(){windowRect = GUILayout.Window(0, windowRect, DoMyWindow, "My Window");}void DoMyWindow(int windowID){if (GUILayout.Button("Hello World")){print("Got a click");}}
}

8

3.12 GUILayoutOption

  • GUILayoutOption是绝大部分GUILayout方法的可选参数,他的主要作用就是控制GUI的样式。
  • 有以下这些方法会返回GUILayoutOption:
GUILayout.Width(float width) // 传递给控件以使其具有绝对宽度的选项
GUILayout.Height(float height) // 传递给控件以使其具有绝对高度的选项
GUILayout.MinWidth(float width) // 传递给控件以指定最小宽度的选项
GUILayout.MinHeight(float height) // 传递给控件以指定最小高度的选项
GUILayout.MaxWidth(float width)// 传递给控件以指定最大宽度的选项
GUILayout.MaxHeight(float width) // 传递给控件以指定最大高度的选项
GUILayout.ExpandHeight(bool expand) // 传递给控件以允许或禁止垂直扩展的选项
GUILayout.ExpandWidth(bool expand) // 传递给控件以允许或禁止水平扩展的选项

4. 其他

以上主要就是进行OnGUI的使用,实际上,GUILayout类还能用于Editor方法。Editor类与GUILayout类进行编辑器拓展,列如:

using UnityEditor;
using UnityEngine;[CustomEditor(typeof(GUILayoutExample))]
public class GUILayoutEditor : Editor
{public override void OnInspectorGUI(){base.OnInspectorGUI();GUILayoutExample tar = target as GUILayoutExample;if (GUILayout.Button("开始调试")){tar.TestFunc();}}
}

10

这篇关于Unity 编辑器篇|(五)编辑器拓展GUILayout类 (全面总结 | 建议收藏)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/609092

相关文章

Spring Boot 常用注解详解与使用最佳实践建议

《SpringBoot常用注解详解与使用最佳实践建议》:本文主要介绍SpringBoot常用注解详解与使用最佳实践建议,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、核心启动注解1. @SpringBootApplication2. @EnableAutoConfi

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

MySQL主从同步延迟问题的全面解决方案

《MySQL主从同步延迟问题的全面解决方案》MySQL主从同步延迟是分布式数据库系统中的常见问题,会导致从库读取到过期数据,影响业务一致性,下面我将深入分析延迟原因并提供多层次的解决方案,需要的朋友可... 目录一、同步延迟原因深度分析1.1 主从复制原理回顾1.2 延迟产生的关键环节二、实时监控与诊断方案

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自