Unity LayoutElement
Unity LayoutElement 完整介绍
一、是什么
LayoutElement 是UGUI自动布局系统的核心组件之一,单独挂载在UI物体上,用来给该控件自定义布局约束权重、最小/首选/最大尺寸,覆盖默认布局(Horizontal/Vertical Layout Group、Grid Layout Group)自动计算的大小。
作用:让布局组不再完全根据子物体自身RectTransform尺寸分配空间,由LayoutElement定义该元素的尺寸规则。
二、核心使用场景
- 同一行/列多个控件,设置不同伸缩权重,实现按比例分配剩余空间;
- 强制限制控件最小宽度/高度,防止被布局压缩到看不见;
- 限制控件最大尺寸,避免拉伸过大;
- 单独指定控件理想尺寸(Preferred),脱离Image/Text原生尺寸。
三、面板参数详解
1. Ignore Layout(忽略布局)
勾选后,布局组完全忽略该物体,布局计算时不把它当作子元素,不受Layout Group尺寸分配影响。
适用:悬浮弹窗、背景装饰、固定位置图标。
2. Minimum Width / Minimum Height(最小宽高)
布局压缩时,该物体不能小于这个尺寸。
例:文本框最小宽100,窗口缩小时文字框不会挤成一条细线。
3. Preferred Width / Preferred Height(首选宽高)
布局分配空间时,优先给它分配这个大小,是元素理想尺寸。
- 无LayoutElement时:Text/Image自动用自身内容尺寸作为Preferred;
- 挂载后:这里数值会覆盖原生首选尺寸。
4. Flexible Width / Flexible Height(弹性权重,核心)
控制剩余空白空间的分配比例,默认0(不伸缩)。
规则:
- 值=0:只使用Preferred尺寸,不占用多余空白;
- 值>0:多个元素按数值比例瓜分布局剩下的空余空间。
示例:
- A弹性宽=1,B弹性宽=2 → 剩余空间A拿1/3,B拿2/3;
- 所有子元素弹性都为0:布局会紧贴每个控件Preferred尺寸,中间留空隙。
四、配套布局组搭配逻辑
LayoutElement 必须配合以下Layout Group才生效:
- Horizontal Layout Group 水平布局
- Flexible Width 生效,控制横向伸缩比例
- Vertical Layout Group 垂直布局
- Flexible Height 生效,控制纵向伸缩比例
- Grid Layout Group 网格布局
- Grid固定Cell Size,Flexible基本失效,Min/Preferred仅作参考
五、实操示例
案例1:左右1:2等分铺满面板
- 父物体加 Horizontal Layout Group;
- 两个子物体都挂载 LayoutElement;
- 左:Flexible Width = 1;
- 右:Flexible Width = 2;
效果:自动平分父物体全部宽度,比例1:2。
案例2:按钮固定大小,输入框填满剩余区域
- 按钮LayoutElement:Flexible Width=0,Preferred Width=120;
- 输入框LayoutElement:Flexible Width=1;
效果:按钮固定120宽,输入框自动占满剩下所有宽度。
案例3:限制文本最小高度
文本LayoutElement → Minimum Height=40;
窗口缩小垂直空间时,文本框最低不会低于40像素。
六、代码动态控制(C#)
using UnityEngine.UI;
LayoutElement le = GetComponent<LayoutElement>();
// 弹性权重
le.flexibleWidth = 1;
le.flexibleHeight = 0;
// 最小尺寸
le.minWidth = 80;
le.minHeight = 30;
// 首选尺寸
le.preferredWidth = 150;
le.preferredHeight = 40;
// 忽略布局
le.ignoreLayout = false;
// 修改后强制刷新布局(可选,避免延迟)
LayoutRebuilder.ForceRebuildLayoutImmediate(transform.parent.GetComponent<RectTransform>());
七、常见踩坑点
- 加了LayoutElement不生效
- 父物体必须有Layout Group(水平/垂直);
- 不要勾选Ignore Layout;
- 弹性权重必须大于0才会自动拉伸。
- 布局错乱、尺寸不更新
动态修改数值后调用LayoutRebuilder.ForceRebuildLayoutImmediate强制刷新。 - Text文字自适应和LayoutElement冲突
挂载LayoutElement后,Text自动宽高会失效,以Preferred Width为准。 - Flexible为0但控件仍被拉伸
检查父Layout Group是否勾选了 Child Force Expand(强制子物体拉伸),取消即可。
八、和ContentSizeFitter区别
- LayoutElement:给布局组提供尺寸规则,控制子元素在布局中的分配;
- ContentSizeFitter:根据自身内容自动修改RectTransform尺寸(文字自适应、图片自适应);
两者经常搭配使用:ContentSizeFitter自动计算Preferred尺寸,LayoutElement限制最小尺寸+设置伸缩权重。