2025Unity必备知识——GUI(完整详细) - 指南
一、GUI概述
全称:即时模式游戏用户交互界面(Immediate Mode GUI,简称 IMGUI)
本质:Unity 内置的一套完全由代码驱动的 UI 系统,与面向玩家的 UGUI 系统有本质区别
核心特点:无需在场景中创建 UI 元素,完全通过脚本代码绘制和控制界面
二、工作原理和主要作用
1.GUI 的定义
- 全称:即时模式游戏用户交互界面(Immediate Mode GUI,简称 IMGUI)
- 在 Unity 中:通常简称为 GUI
- 本质:一个完全由代码驱动的 UI 系统,与 Unity 的 UGUI(面向玩家的 UI 系统)有本质区别
2.GUI 的主要作用
- 调试工具:作为程序员的调试工具,可快速创建游戏内调试界面
- 自定义检视面板:为脚本组件创建自定义的 Inspector 面板,方便编辑
- 拓展 Unity 编辑器:创建新的编辑器窗口和工具,用于扩展 Unity 本身功能(主要用于开发内置游戏工具)
重要注意事项:GUI 不适合用于制作玩家可见的游戏 UI,其设计初衷是为开发者提供便捷的开发调试工具,而非面向最终用户的交互界面。
3.GUI 的工作原理
(1)实现位置:需在继承MonoBehaviour
的脚本中的特殊函数OnGUI()
内调用 GUI 提供的方法
(2)函数特性:
【1】OnGUI()
是专门用于绘制 GUI 界面的生命周期函数
【2】每帧都会执行,类似于Update()
但执行时机不同
【3】推荐只在其中执行 GUI 相关的界面绘制和交互逻辑
(3)执行时机:在LateUpdate()
之后、OnDisable()
之前执行
(4)使用范围:任何继承MonoBehaviour
的脚本都可以通过OnGUI()
方法绘制 GUI 元素
4.基础代码结构
using UnityEngine;
public class Lesson1 : MonoBehaviour
{
// GUI相关代码需写在OnGUI方法中
private void OnGUI()
{
// 在此处编写GUI元素的绘制代码
}
}
三、基础控件
1.GUI 控件绘制的共同点
(1)调用方式统一
所有 GUI 控件都是GUI
公共类中提供的静态函数,直接通过GUI.控件名()
的方式调用即可。
(2)参数模式相似
各类控件的参数构成大同小异,主要包含:
- 位置参数:
Rect
类型,包含 x、y 坐标和 w、h 尺寸 - 显示文本:
string
类型,用于显示文字内容 - 图片信息:
Texture
类型,用于显示图片 - 综合信息:
GUIContent
类型,可同时包含文本、图片和提示信息 - 自定义样式:
GUIStyle
类型,用于自定义控件外观
(3)重载方法丰富
每种控件都有多种重载方法,本质是上述参数的不同组合,其中位置信息和显示信息是必备参数
2.文本控件(Label)
文本控件是 GUI 中最基础的元素,用于显示文本或图片信息。
(1)基本使用方式
// 仅显示文本
GUI.Label(new Rect(0, 0, 100, 20), "黑马王子欢迎你");
// 仅显示图片
GUI.Label(rect, tex); // rect是Rect类型变量,tex是Texture类型变量
// 显示综合信息(可包含文本、图片和提示)
GUI.Label(rect1, content); // content是GUIContent类型变量
(2)提示信息(Tooltip)
通过GUI.tooltip
可以获取当前鼠标悬停的 GUI 控件的提示信息,常用于显示辅助说明:
Debug.Log(GUI.tooltip); // 输出当前控件的提示文本
(3)自定义样式
可通过GUIStyle
参数自定义文本控件的外观(字体、颜色、背景等):
GUI.Label(new Rect(0, 0, 100, 20), "带样式的文本", style); // style是GUIStyle变量
3.按钮控件(Button)
按钮控件用于响应用户的点击操作,主要有两种类型:普通按钮和长按按钮。
(1)普通按钮(Button)
- 触发条件:在按钮范围内按下鼠标并抬起才算一次有效点击
- 返回值:点击成功时返回
true
- 使用示例:
if (GUI.Button(btnRect, btnContent, btnStyle))
{
// 处理按钮点击逻辑
Debug.Log("按钮被点击");
}
(2)长按按钮(RepeatButton)
- 触发条件:只要鼠标在按钮范围内保持按下状态,就会持续返回
true
- 适用场景:需要持续响应的操作(如音量调节、移动控制等)
- 使用示例:
if (GUI.RepeatButton(btnRect, btnContent))
{
Debug.Log("长按按钮被点击"); // 长按期间会持续输出
}
(3)参数说明
btnRect
:Rect
类型,定义按钮的位置和大小btnContent
:GUIContent
类型,按钮上显示的内容(文本、图片等)btnStyle
:GUIStyle
类型,自定义按钮的外观样式
4.多选框(Toggle)
多选框用于实现 "开启 / 关闭" 或 "选择 / 未选择" 的二元状态切换功能。
(1)普通样式使用
// 声明一个布尔变量记录选中状态
private bool isSel;
// 在OnGUI中绘制多选框
isSel = GUI.Toggle(new Rect(0, 0, 100, 30), isSel, "效果开关");
- 参数说明:
- 第一个参数:
Rect
类型,定义多选框位置和大小 - 第二个参数:
bool
类型,当前选中状态 - 第三个参数:显示文本(也可使用
GUIContent
显示图片 + 文本)
- 第一个参数:
- 工作原理:多选框的状态会通过返回值自动更新到变量中
(2)自定义样式及常见问题
// 使用自定义样式时可能需要调整样式属性
isSel2 = GUI.Toggle(new Rect(0, 40, 100, 30), isSel2, "音效开关", style);
- 常见样式调整需求:
fixedWidth
和fixedHeight
:修改控件固定宽高padding
:调整从样式边缘到内容起始处的空间(解决内容显示不全问题)
- 建议通过自定义
GUIStyle
来优化多选框的外观适配
5.单选框(Radio Button)
单选框用于从多个选项中选择唯一项,Unity 中没有专门的单选框控件,而是通过多选框(Toggle)实现。
(1)实现原理
- 使用一个整数变量(
nowSelIndex
)记录当前选中项的索引 - 每个选项对应一个多选框,通过索引判断该选项是否被选中
(2)代码实现
// 声明索引变量记录当前选中项
private int nowSelIndex = 1; // 默认选中第一项
// 在OnGUI中绘制单选框组
if(GUI.Toggle(new Rect(0, 100, 100, 30), nowSelIndex == 1, "选项一"))
{
nowSelIndex = 1; // 选中第一项时更新索引
}
if(GUI.Toggle(new Rect(0, 140, 100, 30), nowSelIndex == 2, "选项二"))
{
nowSelIndex = 2; // 选中第二项时更新索引
}
if(GUI.Toggle(new Rect(0, 180, 100, 30), nowSelIndex == 3, "选项三"))
{
nowSelIndex = 3; // 选中第三项时更新索引
}
(3)核心逻辑
- 每个选项的选中状态由
nowSelIndex == 选项编号
决定 - 当点击某个选项时,将
nowSelIndex
设置为该选项的编号,实现 "唯一选中" 效果 - 同一组单选框必须共享同一个索引变量才能保证互斥性
6.输入框控件
输入框用于接收用户的文本输入,Unity 提供了两种常用的输入框类型。
(1)普通输入框(TextField)
// 声明字符串变量存储输入内容
private string inputStr = "";
// 在OnGUI中绘制输入框
inputStr = GUI.TextField(new Rect(0, 0, 100, 30), inputStr, 5);
- 参数说明:
- 第一个参数:
Rect
类型,定义输入框位置和大小 - 第二个参数:
string
类型,当前显示的文本内容 - 第三个参数(可选):整数,限制最大输入字符数(示例中限制为 5 个字符)
- 第一个参数:
- 工作原理:用户输入的内容会实时更新到绑定的字符串变量中
(2)密码输入框(PasswordField)
// 声明字符串变量存储密码
private string inputPW = "";
// 在OnGUI中绘制密码框
inputPW = GUI.PasswordField(new Rect(0, 50, 100, 30), inputPW, '★');
- 特殊参数:第三个参数为密码掩码字符(示例中使用 '★')
- 特性:输入的实际内容会被掩码字符替代显示,保护敏感信息
- 其他参数与普通输入框一致,同样支持最大长度限制
7.拖动条控件
拖动条用于让用户通过拖拽方式设置一个范围内的数值,分为水平和竖直两种方向。
(1)水平拖动条(HorizontalSlider)
// 声明浮点变量存储当前值
private float nowValue = 0.5f; // 初始值
// 在OnGUI中绘制水平拖动条
nowValue = GUI.HorizontalSlider(
new Rect(0, 100, 100, 50), // 位置和大小(宽度影响可拖动范围)
nowValue, // 当前值
0, // 最小值
1 // 最大值
);
Debug.Log(nowValue); // 实时输出当前值
(2)竖直拖动条(VerticalSlider)
// 使用同一个变量存储值(也可单独声明)
nowValue = GUI.VerticalSlider(
new Rect(0, 150, 50, 100), // 位置和大小(高度影响可拖动范围)
nowValue, // 当前值
0, // 最小值
1 // 最大值
);
(3)共同特性
- 取值范围:始终在最小值和最大值之间,不会超出范围
- 实时更新:拖动过程中会实时更新绑定的变量值
- 适用场景:音量调节、亮度设置、进度控制等需要连续取值的场景
8.图片绘制(DrawTexture)
GUI.DrawTexture
是 IMGUI 中专门用于绘制图片(Texture)的核心方法,支持灵活的显示模式和透明控制,是构建带图界面的基础。
(1)核心参数解析
// 完整方法示例
GUI.DrawTexture(texPos, tex, mode, alpha, wh);
参数名 | 类型 | 核心作用 | 注意事项 |
---|---|---|---|
texPos | Rect | 定义图片的显示位置(x,y)和尺寸(w,h) | 决定图片在屏幕上的区域,宽高会影响后续缩放模式的效果 |
tex | Texture | 待绘制的图片资源(需在 Inspector 面板赋值) | 支持 Texture2D 等常见图片格式,需确保资源已正确导入 |
mode | ScaleMode | 图片的缩放适配模式(枚举类型) | 关键参数,决定图片是否拉伸、裁剪或保持比例 |
alpha | bool | 是否启用图片的透明通道 | 设为true 时,图片的透明区域会正常显示;设为false 时透明区域会变黑 |
wh | float | 自定义图片宽高比(可选) | 默认为0 ,此时使用图片原始宽高比;设为具体值(如16/9 )时强制按该比例显示 |
(2)关键枚举:ScaleMode(缩放模式)
ScaleMode
决定了图片如何适配 texPos
定义的矩形区域,三种常用模式的区别如下:
模式 | 核心效果 | 适用场景 |
---|---|---|
ScaleMode.StretchToFill | 强制拉伸图片,填充满整个 Rect 区域 | 图片尺寸与显示区域比例一致时(如背景图),避免留空 |
ScaleMode.ScaleToFit | 保持图片原始宽高比,确保图片完全显示在 Rect 内 | 需完整展示图片内容,不允许裁剪(如图标、Logo) |
ScaleMode.ScaleAndCrop | 保持图片原始宽高比,填满 Rect 区域,超出部分裁剪 | 需填满显示区域,允许裁剪边缘(如头像、封面图) |
(3)常见使用场景
- 绘制界面背景图(用
StretchToFill
模式) - 显示图标或道具图片(用
ScaleToFit
模式,避免变形) - 绘制带透明通道的装饰元素(需将
alpha
设为true
)
9.框绘制(Box)
GUI.Box
用于绘制一个矩形边框或带背景的矩形区域,常作为界面分组容器或装饰框使用。
(1) 基础使用方式
// 绘制空文本的框(仅显示边框/背景)
GUI.Box(texPos, "");
// 绘制带文本的框(边框+文本)
GUI.Box(new Rect(50, 50, 200, 100), "这是一个框");
// 绘制带图片的框(边框+图片,需用GUIContent)
GUI.Box(new Rect(50, 200, 200, 100), new GUIContent(tex, "图片框提示"));
(2)核心特性
- 本质:
Box
是一个基础容器控件,默认带有浅灰色边框和白色背景(可通过GUIStyle
自定义) - 文本 / 图片支持:第二个参数支持
string
(文本)或GUIContent
(文本 + 图片 + 提示) - 常用场景:
- 划分界面区域(如将多个控件包裹在一个框内,提升可读性)
- 显示提示性文本或图片(如调试面板的标题栏)
- 作为自定义控件的背景容器
四、复合控件
1.工具栏(Toolbar)
工具栏是用于实现标签页切换的基础控件,通过点击不同选项可以快速切换功能界面。
(1)基本使用方法
// 声明索引变量记录当前选中项
private int toolbarIndex = 0;
// 定义工具栏选项文本
private string[] toolbarInfos = new string[] { "强化", "进阶", "幻化" };
// 在OnGUI中绘制工具栏
toolbarIndex = GUI.Toolbar(
new Rect(0, 0, 200, 30), // 位置和大小(宽度需能容纳所有选项)
toolbarIndex, // 当前选中的索引
toolbarInfos // 选项文本数组
);
(2)功能实现逻辑
通过toolbarIndex
的数值变化来处理不同选项的逻辑:
switch (toolbarIndex)
{
case 0: // 选中"强化"
// 执行强化相关逻辑
break;
case 1: // 选中"进阶"
// 执行进阶相关逻辑
break;
case 2: // 选中"幻化"
// 执行幻化相关逻辑
break;
}
(3)特性与适用场景
- 选项水平排列,适合较少的分类(3-5 个选项)
- 视觉上是一个整体条带,选中项有明显高亮
- 常用于功能分类切换(如角色面板的不同属性页)
2.选择网格(SelectionGrid)
选择网格是工具栏的扩展形式,支持多行多列排列选项,更适合较多选项的场景。
(1)基本使用方法
// 声明索引变量记录当前选中项
private int selGridIndex = 0;
// 在OnGUI中绘制选择网格
selGridIndex = GUI.SelectionGrid(
new Rect(0, 50, 200, 60), // 位置和大小(高度需适应行数)
selGridIndex, // 当前选中的索引
toolbarInfos, // 选项文本数组(可复用工具栏的数组)
1 // 水平方向最多显示的按钮数量
);
(2)核心参数区别
相比工具栏多了一个关键参数:xCount
(示例中为 1)
- 作用:指定水平方向最多显示的选项数量
- 效果:当选项数量超过
xCount
时,会自动换行显示 - 示例:若
xCount=2
,3 个选项会显示为 2 行(第一行 2 个,第二行 1 个)
(3)特性与适用场景
- 支持多行多列布局,适合较多选项(5 个以上)
- 选项是独立按钮样式,选中状态清晰
- 常用于物品分类、技能选择等需要密集排列选项的场景
3.分组(Group)
分组控件用于将多个 GUI 元素组合在一起,实现批量位置控制,类似于 UI 系统中的父容器概念。
(1)基本使用方法
// 定义分组的位置和大小
public Rect groupPos; // 可在Inspector面板设置具体值
// 开始一个分组
GUI.BeginGroup(groupPos);
// 分组内的控件(坐标是相对于分组的局部坐标)
GUI.Button(new Rect(0, 0, 100, 50), "测试按钮"); // 相对于分组左上角(0,0)
GUI.Label(new Rect(0, 60, 100, 20), "Label信息");
// 结束分组
GUI.EndGroup();
(2)核心作用
- 坐标转换:分组内所有控件的坐标都是相对于分组本身的局部坐标(而非屏幕坐标)
- 批量控制:修改
groupPos
的位置,可同时移动组内所有控件 - 区域裁剪:超出分组
Rect
范围的控件内容会被自动裁剪(只显示在分组区域内的部分)
(3)适用场景
- 多个相关控件的整体移动和布局管理
- 实现界面模块的封装(如一个独立的功能面板)
- 创建带边界的区域(超出部分自动隐藏)
4.滚动列表(ScrollView)
滚动列表用于显示超出固定区域的内容,通过滚动条实现内容的浏览,是处理大量信息展示的重要控件。
(1)基本使用方法
// 定义滚动视图的显示区域
public Rect scPos; // 可视区域的位置和大小
public Rect showPos; // 内容区域的总大小(通常大于scPos)
// 记录当前滚动位置
private Vector2 nowPos;
// 开始滚动视图
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();
(2)核心参数解析
scPos
:滚动视图在屏幕上的可视区域(用户能直接看到的区域)nowPos
:Vector2
类型,记录当前滚动的位置(x/y 分别对应水平 / 垂直滚动偏移)showPos
:内容区域的总大小(需要大于scPos
才会出现滚动条)
(3)工作原理
- 当
showPos
的宽 / 高大于scPos
的宽 / 高时,会自动出现水平 / 垂直滚动条 - 用户拖动滚动条时,
nowPos
的值会自动更新 - 内容区域的控件位置是相对于
showPos
的,通过nowPos
的偏移实现滚动效果
(4)适用场景
- 显示大量文本、列表项或控件(如道具列表、日志输出)
- 内容尺寸不固定或动态变化的界面
- 需要在有限空间内展示更多信息的场景
5.基础窗口(Window)
窗口控件是 IMGUI 中用于创建独立交互区域的高级控件,支持在内部添加各种子控件,形成功能完整的界面模块。
(1)基本使用方法
// 在OnGUI中绘制窗口
GUI.Window(
1, // 窗口唯一ID(整数)
new Rect(100, 100, 200, 150), // 窗口位置和大小
DrawWindow, // 绘制窗口内容的委托函数
"测试窗口" // 窗口标题
);
(2)窗口内容绘制函数
// 专门用于绘制窗口内部内容的函数
private void DrawWindow(int id)
{
// 根据窗口ID区分不同窗口的内容
switch (id)
{
case 1:
GUI.Button(new Rect(0, 30, 30, 20), "1"); // 窗口1的按钮
break;
case 2:
GUI.Button(new Rect(0, 30, 30, 20), "2"); // 窗口2的按钮
break;
}
}
(3)核心特性
- 唯一 ID:每个窗口必须有独一无二的整数 ID,用于区分不同窗口
- 独立区域:窗口拥有自己的坐标系统,内部控件坐标相对于窗口左上角
- 标题栏:自动生成标题栏,显示标题文本
- 多窗口管理:通过 ID 在同一个绘制函数中管理多个窗口的内容
6.模态窗口(ModalWindow)
模态窗口是一种特殊的窗口,具有最高的交互优先级,会阻塞其他控件的交互。
(1)使用方法
// 绘制模态窗口
GUI.ModalWindow(
3, // 唯一ID
new Rect(300, 100, 200, 150), // 位置和大小
DrawWindow, // 内容绘制函数(可复用普通窗口的函数)
"模态窗口" // 标题
);
(2)核心特性
- 交互阻塞:模态窗口显示时,其他所有非该窗口内的控件都无法交互
- 层级最高:始终显示在其他控件上方,不会被遮挡
- 使用场景:
- 重要操作确认(如 "是否删除" 对话框)
- 必须处理的提示信息
- 需要用户立即关注的内容
7.可拖动窗口
通过简单的设置,可以让普通窗口支持鼠标拖动,提升窗口的交互灵活性
(1)实现方法
// 声明变量存储窗口位置(需要修改,所以不用public)
private Rect dragWinPos = new Rect(400, 400, 200, 150);
// 在OnGUI中绘制可拖动窗口(注意位置参数用变量)
dragWinPos = GUI.Window(4, dragWinPos, DrawWindow, "拖动窗口");
// 在窗口绘制函数中添加拖动功能
private void DrawWindow(int id)
{
if (id == 4)
{
// 启用窗口拖动功能
// 参数是一个Rect,定义窗口中可拖动的区域
GUI.DragWindow(new Rect(0, 0, 1000, 20)); // 这里定义标题栏区域可拖动
}
}
(2)拖动区域控制
GUI.DragWindow()
的Rect
参数定义了窗口中可拖动的区域:- 示例中
new Rect(0, 0, 1000, 20)
表示窗口顶部 20 像素高的区域可拖动(模拟标题栏) - 若使用无参重载
GUI.DragWindow()
,则窗口任意位置都可拖动
- 示例中
- 拖动区域通常设置为标题栏,符合用户操作习惯
五、自定义皮肤样式
1.全局颜色控制
IMGUI 提供了多种全局颜色属性,用于快速调整控件的外观颜色,这些颜色会以叠加方式影响控件的最终显示效果。
(1)核心颜色属性
GUI.color
:全局基础着色颜色,会同时影响控件的背景和文本颜色GUI.contentColor
:文本内容的着色颜色,最终颜色 = 该颜色 ×GUI.color
GUI.backgroundColor
:背景元素的着色颜色,最终颜色 = 该颜色 ×GUI.color
(2)使用示例
// 设置全局基础颜色为红色
GUI.color = Color.red;
// 文本颜色 = yellow × red = 橙色
GUI.contentColor = Color.yellow;
GUI.Button(new Rect(0, 0, 100, 30), "测试按钮");
// 背景颜色 = red × red = 深红色
GUI.backgroundColor = Color.red;
GUI.Label(new Rect(0, 50, 100, 30), "测试标签");
// 重置全局颜色为白色(不影响后续控件)
GUI.color = Color.white;
GUI.Button(new Rect(0, 100, 100, 30), "测试按钮", style);
(3)注意事项
- 颜色设置具有累加性,建议在设置特定颜色后及时重置(通常重置为
Color.white
) - 自定义
GUIStyle
的颜色设置会覆盖全局颜色 - 适合快速调整一组控件的色调,不适合精细的样式定制
2.整体皮肤样式(GUISkin)
GUISkin
是一种可以保存整套控件样式的资源,用于统一管理多个控件的外观,比单独设置GUIStyle
更高效。
(1)使用方法
// 声明GUISkin变量(需在Inspector面板赋值)
public GUISkin skin;
// 在OnGUI中应用皮肤
GUI.skin = skin;
GUI.Button(new Rect(0, 0, 100, 30), "测试按钮"); // 使用皮肤样式
// 取消皮肤应用(恢复默认样式)
GUI.skin = null;
GUI.Button(new Rect(0, 50, 100, 30), "测试按钮2"); // 使用默认样式
(2)核心特性
- 一站式管理:一个
GUISkin
包含所有 GUI 控件(按钮、标签、输入框等)的默认样式 - 优先级规则:绘制控件时如果指定了
GUIStyle
参数,会覆盖皮肤中的对应样式 - 资源复用:可以在多个脚本中共享同一个
GUISkin
,保证界面风格一致
(3)创建与配置GUISkin
- 在 Project 窗口右键 →
Create → GUI Skin
创建皮肤资源 - 选中资源,在 Inspector 面板中可分别设置各种控件的样式(字体、颜色、边框等)
- 适合需要统一风格的界面,如整个调试工具采用相同设计语言
3.GUILayout 自动布局系统
GUILayout
是 IMGUI 提供的自动布局系统,与之前学习的 GUI
手动布局不同,它能自动计算控件的位置和大小,大幅简化界面排版工作。
(1)核心特性
- 无需手动指定
Rect
位置,控件会自动排列 - 支持水平和垂直两种基本布局方向
- 主要用于编辑器工具开发,不推荐用于游戏运行时 UI
(2)基本使用方法
// 结合分组控制整体位置
GUI.BeginGroup(new Rect(100, 100, 200, 300));
// 开始垂直布局(控件上下排列)
GUILayout.BeginVertical();
// 垂直布局内的控件(无需指定位置)
GUILayout.Button("123", GUILayout.Width(200)); // 固定宽度
GUILayout.Button("245666656565"); // 自动适应内容宽度
GUILayout.Button("235", GUILayout.ExpandWidth(false)); // 不水平拓展
// 结束垂直布局
GUILayout.EndVertical();
// 结束分组
GUI.EndGroup();
(3)常用布局容器
GUILayout.BeginVertical()
/GUILayout.EndVertical()
:垂直布局(控件上下排列)GUILayout.BeginHorizontal()
/GUILayout.EndHorizontal()
:水平布局(控件左右排列)- 布局容器可以嵌套使用,实现复杂的界面结构
(4)适用场景
- 编辑器扩展工具开发(如自定义编辑器窗口)
- 快速原型开发,不需要精确控制控件位置
- 调试工具界面,优先考虑开发效率而非精确布局
4.GUILayoutOption 布局选项
布局选项用于在自动布局系统中控制控件的尺寸和拓展行为,是 GUILayout
控件的可选参数。
(1)常用布局选项
选项 | 作用 | 示例 |
---|---|---|
GUILayout.Width(float) | 设置控件固定宽度 | GUILayout.Button("按钮", GUILayout.Width(100)) |
GUILayout.Height(float) | 设置控件固定高度 | GUILayout.Button("按钮", GUILayout.Height(50)) |
GUILayout.MinWidth(float) | 设置最小宽度(不小于该值) | GUILayout.Label("文本", GUILayout.MinWidth(80)) |
GUILayout.MinHeight(float) | 设置最小高度(不小于该值) | GUILayout.Label("文本", GUILayout.MinHeight(20)) |
GUILayout.MaxWidth(float) | 设置最大宽度(不大于该值) | GUILayout.TextField("输入", GUILayout.MaxWidth(200)) |
GUILayout.MaxHeight(float) | 设置最大高度(不大于该值) | GUILayout.TextField("输入", GUILayout.MaxHeight(30)) |
GUILayout.ExpandWidth(bool) | 是否允许水平方向拓展 | GUILayout.Button("按钮", GUILayout.ExpandWidth(false)) |
GUILayout.ExpandHeight(bool) | 是否允许垂直方向拓展 | GUILayout.Button("按钮", GUILayout.ExpandHeight(true)) |
(2)使用规则
- 布局选项作为控件的最后一个参数传入,可同时指定多个
- 示例:
GUILayout.Button("按钮", GUILayout.Width(100), GUILayout.Height(50))
- 选项之间可能存在优先级关系(如固定宽度会覆盖最小 / 最大宽度)
(3)实际应用
- 固定关键控件的尺寸,保证界面稳定性
- 限制控件的最大尺寸,避免内容过多导致界面变形
- 控制控件是否填充父容器空间,优化布局效果
5.编辑器模式下执行脚本
(1)[ExecuteAlways] 特性的作用
[ExecuteAlways]
是 Unity 中的一个类级特性,它的核心作用是让脚本在编辑模式下也能执行生命周期函数,打破了默认情况下脚本仅在运行模式(Play Mode)下执行逻辑的限制。
- 默认行为:普通 MonoBehaviour 脚本的生命周期函数(如 Update、Start 等)仅在进入 Play 模式后才会执行
- 加特性后:脚本在编辑模式下(未进入 Play 模式时)也会执行大部分生命周期函数,方便在编辑阶段预览效果或执行特定逻辑
(2)编辑模式下的生命周期函数执行情况
使用 [ExecuteAlways]
后,以下生命周期函数在编辑模式下的执行特点:
生命周期函数 | 编辑模式下的执行情况 | 特殊说明 |
---|---|---|
Awake | 脚本加载或重新编译后执行一次 | 与运行模式行为一致 |
OnEnable | 脚本启用时执行 | 勾选 / 取消勾选脚本组件时触发 |
Start | 脚本首次激活后执行一次 | 编辑模式下也只会执行一次 |
FixedUpdate | 不会执行 | 仅在运行模式下按固定时间间隔执行 |
Update | 当场景有变化时执行(如移动物体、修改属性) | 并非每帧执行,而是响应编辑操作 |
LateUpdate | 同 Update,在编辑操作后执行 | 执行时机晚于 Update |
OnGUI | 每帧执行(包括编辑模式) | 与运行模式行为一致,适合绘制编辑模式下的 GUI |
OnDisable | 脚本禁用时执行 | 取消勾选脚本组件时触发 |
OnDestroy | 脚本销毁时执行 | 删除游戏对象或移除组件时触发 |
(3)实际应用场景
[ExecuteAlways]
特性主要用于提升编辑阶段的工作效率,常见应用场景包括:
编辑模式下的实时预览例如:自定义工具、特效预览、地形编辑辅助等,无需进入 Play 模式即可看到效果
编辑器扩展工具开发配合 IMGUI 可以在编辑模式下绘制交互界面,创建自定义编辑工具
资源验证与处理在编辑阶段自动检测资源是否符合规范,及时给出提示
场景布局辅助动态调整场景元素位置或属性,辅助关卡设计
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917975.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!