Unity UGUI布局组件(LayoutGroup、ContentSizeFitter、LayoutElement)详解

发布时间:2026/11/4 19:48:51

Unity UGUI布局组件(LayoutGroup、ContentSizeFitter、LayoutElement)详解 UGUI 自动布局是一套基于接口、分两轮四阶段、脏标记延迟批量执行的 C# 排版系统和 Transform 原生锚点完全隔离 所有布局组件都围绕两个接口ILayoutElement提供尺寸信息min/preferred/flexible回答 “我应该多大”ILayoutControllerILayoutGroup收集子元素尺寸、分配空间、写 RectTransform负责 “把大家摆到哪”Unity三个组件分工LayoutElement数据提供者覆盖 / 声明自己的布局尺寸参数优先级最高LayoutGroupVertical/Horizontal/Grid既是 ILayoutElement对外输出自己整体尺寸又是 ILayoutController控制子物体位置大小ContentSizeFitter只做 ILayoutController只读同物体上 ILayoutElement 的尺寸修改自身 RectTransform 大小不控制子物体整套布局不生成 Mesh、不渲染最终输出只有对 RectTransform 的sizeDelta/anchoredPosition的赋值。LayoutElementLayoutElement 是 ILayoutElement 的实现只负责向外输出尺寸信息不摆放物体、不修改 RectTransform 位置用来覆盖 / 重写 Text、Image、LayoutGroup 自带的 min/preferred/flexible 尺寸。面板逐项解释1. Ignore Layout勾选之后布局系统直接跳过这个物体不参与父 LayoutGroup 的排版计算。这个物体还留在层级里渲染正常2. Min Width / Min Height最小宽高勾选激活填写像素值这个元素被压缩时不能小于这个尺寸是底线。3. Preferred Width / Preferred Height期望 / 偏好宽高勾选激活填写像素值元素最理想、刚刚好的尺寸。 空间足够、满足所有 Min 之后布局系统会尽量把元素给到 Preferred 尺寸。4. Flexible Width / Flexible Height弹性宽高勾选激活填写比例系数不是像素当父 LayoutGroup 分配完所有 MinPreferred 之后还有剩余空白空间就按照所有子 Flexible 的比值瓜分剩下空间。例子 水平布局里两个子A Flexible Width1B Flexible Width2剩余空间一共 300px → A 拿 100B 拿 200。只要任意一个子 Flexible0剩余空间就会被瓜分全部 0就不会拉伸填充。区分Min、Preferred 是像素单位Flexible 是相对权重。5. Layout Priority布局优先级默认 1同一个 GameObject 身上可能有多个 ILayoutElement比如 Text LayoutElement数值越大优先级越高布局系统优先读取高优先级组件输出的尺寸覆盖低优先级Text、Image 原生的 LayoutPriority 默认是 0LayoutElement 默认是 1。这就是为什么挂上 LayoutElement 勾选 Preferred会直接覆盖 Text 文字原生自适应尺寸LayoutElement 优先级更高。如果优先级相同布局会取各个组件里更大的尺寸值。注意理解LayoutElement 这个组件本身挂在物体上不需要 “必须有父物体”但是它的功能想要生效就必须有父级的布局控制器ILayoutController布局控制器 HorizontalLayoutGroup / VerticalLayoutGroup / ContentSizeFitterLayoutElement 的角色对外上报尺寸数据min/preferred/flexible布局控制器的角色读取子物体上报的这些尺寸数据然后去排版、改子物体 RectTransform1. 单纯挂上 LayoutElement没有父 Layout 控制器你可以随便挂不会报错组件面板正常显示完全没有任何视觉效果等于白挂原因LayoutElement 只是一个数据记录本 。它只会存我的最小宽 30、期望宽 100、弹性权重 1……但是没有任何东西来读这份记录就不会有人根据这个数据修改物体大小、位置。2. 有父布局控制器的时候这才是 LayoutElement 的正常用法LayoutElement 是给【直接父 LayoutGroup】读的不是随便哪个祖先是直属父物体3. 一个特殊情况同物体身上搭配 ContentSizeFitterLayoutElement 和 ContentSizeFitter 在同一个物体上不需要别的父 Layout这个场景下不需要外面再套一个父 LayoutGroup作用用 LayoutElement 强行指定这个物体的 preferred 尺寸ContentSizeFitter 把自己缩放到这个 preferred 大小。4. 再单独说 Ignore LayoutLayoutElement 里这个选项特殊Ignore Layout 生效条件这个物体必须是某个 LayoutGroup 的直接子物体父 LayoutGroup 遍历直接子的时候看到子勾选 Ignore Layout → 跳过它不参与排版。如果它根本不是任何 LayoutGroup 的子Ignore Layout 这个勾勾了也没用。Flexible 填 1 不等于占 100%是比值必须多个兄弟一起对比LayoutPriority 是同一个物体多个 ILayoutElement 之间的优先级不是兄弟物体之间的优先级三个 LayoutGroupGrid Layout Group/Horizontal Layout Group/Vertical Layout Group都是ILayoutController布局控制器作用自动排列自己的直接子物体。Horizontal水平一排横向摆放会读取子 LayoutElement 的 Min/Preferred/Flexible弹性生效Vertical垂直一列纵向摆放会读取子 LayoutElement 的 Min/Preferred/Flexible弹性生效Grid网格格子布局固定 CellSize无视子的 Min/Preferred/FlexibleLayoutElement 尺寸除 Ignore Layout 外全部无效)Horizontal Layout Group 水平布局组横向一排排列子物体Padding内边距。Spacing子物体和子物体之间的间距横向间隔。Child Alignment在父容器里怎么对齐Reverse Arrangement反向排列Control Child Size控制子尺寸重点勾选Height代表父 LayoutGroup 接管子物体高度子物体 RectTransform 的高度直接被引擎锁死、不能手动拖拽改。勾选之后子多高多宽由父说了算子自己 LayoutElement 尺寸规则失效。Use Child Scale使用子缩放是否把子物体 RectTransform 的 Scale 算进布局计算里。 一般不勾。如果你的子要动态缩放 UI再开启容易排版错乱。Child Force Expand子强制扩展弹性总开关超级高频Width开启横向弹性通道。 勾选✔后如果子没有自己设置 Flexible布局默认给所有子 Flexible1平分剩余空间 子自己 LayoutElement 写了 Flexible就按写的权重瓜分剩余空白不勾Flexible 完全失效不会自动撑满Height纵向弹性一般很少开。Vertical Layout Group 垂直布局组纵向一列排列子物体参数和 Horizontal 几乎一模一样只是排列方向从上往下。Grid Layout Group 网格布局格子布局重点和上面两个本质不一样核心区别Grid 不读取子的任何 Min/Preferred/FlexibleLayoutElement 尺寸设置无效Grid 逻辑我规定每个格子多大Cell Size所有子强制塞进格子里。Padding网格整体离父容器四边的内边距Cell Size网格核心每个格子的宽和高。这里是 100×100所有子都会被强制放到 100×100 的格子里面。 子物体 Rect 会被 Grid 自动设置成这个尺寸无视 Image/TMP/LayoutElement 想要的大小。Spacing格子与格子之间的间距X 横向格子间距Y 纵向格子间距。Start Corner起始角落从哪个角落开始放第一个子Upper Left 左上 / Upper Right 右上 / Lower Left 左下 / Lower Right 右下。Start Axis起始轴Horizontal优先先排满一行再换行一行放多个再下一行最常用Vertical优先先排满一列再换列一列放满再往右开新列Child Alignment整组网格在父容器里怎么对齐和锚点有关系吗Grid Layout Group 不但不读子物体的锚点还会强行把所有子物体的锚点改成同一个值——左上角(0, 1)由 GridLayoutGroup 驱动的部分参数Constraint 约束模式控制一行多少个 / 一列多少个非常常用Flexible你当前这个自动适配根据父容器宽度自动算一行能放下几个格子父拉宽一行格子变多父变窄一行变少。适合动态网格商品、图标。Fixed Column Count固定列数比如填 3 →永远一行 3 个不管父多宽自动缩放格子间距 / 换行。Fixed Row Count固定行数比如填 2 → 永远一共 2 行。Grid 里面子身上的 LayoutElementIgnore Layout 正常生效勾选后这个子不参与网格排版自由摆放Min / Preferred / Flexible 全部无效Grid 强制 CellSize不走那套分配算法。Content Size Fitter内容尺寸适配器ContentSizeFitter简称 CSF是让自己这个物体的 Rect 大小去贴合它内部内容的 Preferred 尺寸LayoutGroupHorizontal/Vertical/Grid是父管子父来安排子的位置大小CSF 是自己管自己自己根据内部内容自动改变自身宽高 它也是布局控制器ILayoutControllerParent has a type of layout group component. A child of a layout group should not have a Content Size Fitter component, since it should be driven by the layout group.父物体是 LayoutGroupHorizontal/Vertical/Grid这个子物体不建议挂 ContentSizeFitter子的尺寸应该由父 LayoutGroup 来驱动控制。为什么 Unity 给这个警告这里出现了两个控制器抢着控制同一个 RectTransform父HorizontalLayoutGroup它想决定这个子有多宽、放哪里父 Layout 来分配空间子ContentSizeFitter它又想自己决定自己的宽高我要贴合我内部内容 两个布局引擎同时驱动同一个 Rect →布局循环冲突容易抖动、计算错乱、编辑模式闪、Play 模式尺寸随机分两种情况理解不是绝对不能用是容易踩坑情况 A不推荐、警告的结构父HorizontalLayoutGroup父要分配子的尺寸 └──子Image/TMP ContentSizeFitter子又想自己控制自己大小Unity 警告。 能不能跑有时候能跑但是不稳定布局循环风险很高不推荐这么写。情况 B标准、安全、推荐的 CSF 用法不会警告CSF 放在LayoutGroup 自己身上物体AVerticalLayoutGroup ContentSizeFitter ├─子1 ├─子2 └─子3含义 内部 Vertical 自动排列子然后 CSF 让物体 A 的外框自动包裹住里面所有子加起来的总大小。这个是聊天气泡、动态弹窗最经典写法没有警告是正确用法。那如果我 就是想要Horizontal 里面有一个子大小自适应自身内容怎么办正确做法 子物体不要挂 CSF靠子身上的 LayoutElement 的 Preferred 尺寸对外上报 父 HorizontalLayoutGroup 读取子的 Preferred自动适配这个子的大小这才是 Horizontal/VerticalLayoutGroup 的设计逻辑。TMP 自带 ILayoutElement自带 Preferred 尺寸直接给父 Horizontal 读不需要子加 CSF。CSF LayoutElement 的搭配同一个物体ContentSizeFitter LayoutElement作用 CSF 默认跟着 Preferred 走LayoutElement 可以给它加边界限制例子 TMP CSF (HorizontalPreferred) LayoutElementLayoutElement MinWidth30PreferredWidth200 效果 CSF 包裹文字但是宽度最小锁死 30文字短的时候框不会缩到比 30 更小。这里是安全的不会警告因为这个物体外面没有 LayoutGroup 父。4 种常用搭配速记TMP 聊天气泡TMP CSF HorizontalPreferred, VerticalPreferred 无 LayoutGroup 父自动包裹的容器VerticalLayoutGroup CSF Both Preferred CSF 和 LayoutGroup 在同一个物体标准写法横向一行里面 TMP 文字自适应父 HorizontalLayoutGroup子 TMP不加 CSF靠 TMP 原生 PreferredGrid 的子绝对不要加 CSFGrid 强制 CellSize冲突爆炸
延伸阅读

更多相关文章

2026/11/4 19:48:51

SSE 流式输出:数据块边界、语义边界与状态解析

一、SSE 的基本概念与运行机制SSE(Server-Sent Events,服务器发送事件)是一种基于 HTTP 的服务器向客户端持续推送事件的通信机制。它使用 text/event-stream 作为响应的媒体类型,允许服务端在一个持续打开的 HTTP 响应中依次发送…

2026/11/4 19:48:51

从零开始的C语言生活----------变量,分支与循环

1.类型创建变量,运算中的第一缕分支在C语言中,变量的意思十分容易理解,就是变化的量。之前我们学习了类型,那么,类型是做什么的呢?类型就像是月饼的模具侵删像int,char,double之类的…

2026/11/4 20:49:15

小模型+rerank做判定任务:16个实验后的工程复盘

1. 为什么我会盯上“rerank 小模型”这条路线先说结论:这 16 个实验跑完,我认输了,但不是那种“这条路走不通”的认输,而是“用我最初设想的那种最省事的方式走不通”的认输。这个区别很重要,因为它直接决定了你后面要…

2026/11/4 20:49:15

短剧SAAS源码拆包实战:多租户架构与支付回调避坑指南

简介:面向短剧创业者、影视小程序开发者与中小型内容平台运营者的2024版视频短剧SAAS系统源码,采用SAAS多租户架构,可快速搭建一套支持微信小程序与公众号H5双端的短剧分发平台,解决从内容上架、会员运营到分销变现的完整链路问题…

2026/11/4 20:49:15

航空航天大文件传输优化:WebUploader分片与断点续传实践

1. 项目背景与需求解析在航空航天领域的数字化进程中,三维模型文件已成为飞机设计、卫星仿真等核心业务的关键载体。这类文件通常具有以下典型特征:单文件体积庞大(普遍500MB-20GB)包含精密的结构化数据(如CAD模型、流…

2026/11/4 20:49:15

CloudCLI 实战:为 Claude Code 打造可视化 Web 工作台与插件系统

命令行工具用久了,总有一种“效率很高但心里没底”的感觉——尤其是像 Claude Code 这类以终端交互为核心的 AI 编程助手,敲一条指令、等一段流式输出、再手动翻上下文,流程是通的,但状态不可见、插件不好管、多会话切换全靠记忆。…

2026/11/4 20:49:15

APON光模块在工业通信中的革新与应用

1. 工业通信的技术演进与挑战工业通信领域正在经历一场深刻的变革。传统PON(无源光网络)技术虽然在过去十年中为工业互联网提供了基础连接能力,但随着智能制造、工业物联网(IIoT)和边缘计算的快速发展,现有网络架构已经暴露出明显…

2026/11/4 20:44:13

突破万级GFLOPS:CUDA矩阵乘法向量化优化实战

盯着Nsight Compute输出的sm__throughput,看到数字稳稳停在90%以上时,我知道这张卡上纯CUDA向量化的矩阵乘法算是跑通了一个里程碑——单次40964096的FP32 SGEMM,算力突破10000 GFLOPS。从最初300多毫秒的朴素内核,到最后13毫秒出…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑