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

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

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

相关文章

【大厂AI课学习笔记】【1.5 AI技术领域】(8)文本分类

8,9,10,将分别讨论自然语言处理领域的3个重要场景。 自然语言处理,Natual Language Processing,NLP,包括自然语言识别和自然语言生成。 用途是从非结构化的文本数据中,发掘洞见,并访问这些信息&#xff0…

安全之护网(HVV)、红蓝对抗

文章目录 红蓝对抗什么是护网行动?护网分类护网的时间 什么是红蓝对抗红蓝对抗演练的目的什么是企业红蓝对抗红蓝对抗价值参考 红蓝对抗 什么是护网行动? 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方…

kubernetes镜像仓库harbor

一、镜像仓库的种类 GitHub GitHub有付费版和免费版,目前默认的docker镜像拉取策略是从GitHub上进行拉取gitee 国内harbor私有仓库二、harbor仓库规划设计 私有镜像仓库 Harbor 安装和配置 新创建一台虚拟机安装harbor, 配置如下: 主机名ip配置网络harbor192.168.1.204VCPU/…

【芯片设计- RTL 数字逻辑设计入门 14 -- 使用子模块实现三输入数的大小比较】

文章目录 三输入数的大小比较问题分析verilog codeTestBench Code综合图仿真波形图 三输入数的大小比较 在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层…

Java并发基础:ArrayBlockingQueue全面解析!

内容摘要 ArrayBlockingQueue类是一个高效、线程安全的队列实现,它基于数组,提供了快速的元素访问,并支持多线程间的同步操作,作为有界队列,它能有效防止内存溢出,并通过阻塞机制平衡生产者和消费者的速度…

Qt PCL学习(三):点云滤波

注意事项 版本一览:Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容:Qt PCL学习(一):环境搭建、Qt PCL学习(二):点云读取与保存 0. 效果演示 1. pcl_open_save.pro QT core guigr…

安卓服务的常见问题,性能优化以及应用场景剖析

一、引言 在安卓开发中,服务(Service)扮演着至关重要的角色,它们在没有用户界面的情况下,为用户提供了长时间的后台任务执行能力。本文将探讨服务常见问题、优化策略、应用场景以及开发过程中应注意的事项。 二、应用场…

vue3的生命周期

文章目录 一、生命周期1.1、vue2 生命周期1.1.1、vue2 生命周期分类 1.2、vue3 生命周期1.2.1、setup()1.2.2、onBeforeMount()1.2.3、onMounted()1.2.4、onBeforeUpdate()1.2.5、onUpdated()1.2.6、onBeforeUnmount()1.2.7、onUnmounted()1.2.8、其他 二、vue2 和 vue3的生命周…

2024年【高压电工】报名考试及高压电工操作证考试

题库来源:安全生产模拟考试一点通公众号小程序 2024年高压电工报名考试为正在备考高压电工操作证的学员准备的理论考试专题,每个月更新的高压电工操作证考试祝您顺利通过高压电工考试。 1、【单选题】 高压电动机发生单相接地故障时,只要接地电流大于()…

利用Pybind11封装Python版的WiringPi!

原版的WiringPi是一个用于树莓派的GPIO库,用C语言开发,仓库地址:https://github.com/WiringPi/WiringPi。该库允许用户以编程方式访问和控制树莓派的GPIO引脚。而随着Python在嵌入式设备上的快速发展,其对底层引脚的操作也变得越来…

Linux匿名管道

目录 1.原理 1.直接原理 2.本质原理 2.管道接口 3.管道中的四种情况 1.读写端正常,管道如果为空,读端就要堵塞 2.读写端正常,管道如果被写满,写端就要堵塞 3.读端正常,写端关闭,读端就会读到0&#…

springboot169基于vue的工厂车间管理系统的设计

基于VUE的工厂车间管理系统设计与实现 摘 要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。本…