Unity LayoutElement 完整介绍

一、是什么

LayoutElement 是UGUI自动布局系统的核心组件之一,单独挂载在UI物体上,用来给该控件自定义布局约束权重、最小/首选/最大尺寸,覆盖默认布局(Horizontal/Vertical Layout Group、Grid Layout Group)自动计算的大小。
作用:让布局组不再完全根据子物体自身RectTransform尺寸分配空间,由LayoutElement定义该元素的尺寸规则。

二、核心使用场景

  1. 同一行/列多个控件,设置不同伸缩权重,实现按比例分配剩余空间;
  2. 强制限制控件最小宽度/高度,防止被布局压缩到看不见;
  3. 限制控件最大尺寸,避免拉伸过大;
  4. 单独指定控件理想尺寸(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才生效:

  1. Horizontal Layout Group 水平布局
    • Flexible Width 生效,控制横向伸缩比例
  2. Vertical Layout Group 垂直布局
    • Flexible Height 生效,控制纵向伸缩比例
  3. Grid Layout Group 网格布局
    • Grid固定Cell Size,Flexible基本失效,Min/Preferred仅作参考

五、实操示例

案例1:左右1:2等分铺满面板

  1. 父物体加 Horizontal Layout Group;
  2. 两个子物体都挂载 LayoutElement;
  3. 左:Flexible Width = 1;
  4. 右: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>());

七、常见踩坑点

  1. 加了LayoutElement不生效
    • 父物体必须有Layout Group(水平/垂直);
    • 不要勾选Ignore Layout;
    • 弹性权重必须大于0才会自动拉伸。
  2. 布局错乱、尺寸不更新
    动态修改数值后调用 LayoutRebuilder.ForceRebuildLayoutImmediate 强制刷新。
  3. Text文字自适应和LayoutElement冲突
    挂载LayoutElement后,Text自动宽高会失效,以Preferred Width为准。
  4. Flexible为0但控件仍被拉伸
    检查父Layout Group是否勾选了 Child Force Expand(强制子物体拉伸),取消即可。

八、和ContentSizeFitter区别

  • LayoutElement:给布局组提供尺寸规则,控制子元素在布局中的分配;
  • ContentSizeFitter:根据自身内容自动修改RectTransform尺寸(文字自适应、图片自适应);
    两者经常搭配使用:ContentSizeFitter自动计算Preferred尺寸,LayoutElement限制最小尺寸+设置伸缩权重。