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

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

SpringBoot加载profile全面解析

《SpringBoot加载profile全面解析》SpringBoot的Profile机制通过多配置文件和注解实现环境隔离,支持开发、测试、生产等不同环境的灵活配置切换,无需修改代码,关键点包括配置文... 目录题目详细答案什么是 Profile配置 Profile使用application-{profil

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3