How to Develop a Game
Layout
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

Layout System

LayoutSystem

Layout Group

Layout Group是Unity UI自动布局系统的核心组件之一,用于在UI Canvas下自动排列其他子物体。它极大地简化了UI元素的排列和适配逻辑,让UI开发变得更结构化、响应式、更易维护

Layout Group是一类MonoBehaviour脚本,用于自动排列RectTransform子物体的位置与尺寸,不需要你手动拖动它们

类型说明用途示例
HorizontalLayoutGroup子物体沿 水平方向排列菜单栏、工具条、横向列表
VerticalLayoutGroup子物体沿 垂直方向排列聊天记录、竖向按钮组
GridLayoutGroup子物体按 网格排列(行列)背包格子、关卡选择界面
LayoutGroup抽象基类不直接使用

Horizontal / Vertical Layout Group

属性说明
Padding容器四周的边距
Spacing子物体之间的间隔
Child Alignment子物体在主轴上的对齐方式(左/中/右)
Reverse Arrangement排列方向反转:从上到下 → 从下到上
Control Child Size控制子物体是否填满空间
Use Child Scale是否使用子物体的缩放比例
Child Force Expand启用时多个子物体会调整间距,以填充满Width或Height

Horizontal Layout Group适用场景:菜单栏、Tab标签页、道具快捷栏等

Vertical Layout Group适用场景:排行榜列表、聊天内容、选项按钮组等

Grid Layout Group

用于将子物体排列成规则网格,每个格子的大小统一

属性说明
Padding容器四周的边距
Cell Size每个格子的宽高
Spacing格子之间的间距
Start Corner从哪个角开始排列
Start Axis是优先横向填充还是纵向
Child Alignment子物体整体对齐方式
Constraint行数/列数限制(可固定行或列)

使用场景:背包系统、九宫格、商城道具、分页列表

常见问题

问题原因 / 解决方式
改了内容不刷新布局调用 LayoutRebuilder.ForceRebuildLayoutImmediate()
动态添加元素时抖动SetActive(false) 再添加,最后 SetActive(true)
动画或手动设置位置被覆盖LayoutGroup 会自动控制,需禁用 LayoutGroup 才能手动操作
ContentSizeFitter + LayoutGroup 死循环不要放在同一个 GameObject 上

Layout Element

Layout Element用于告诉布局系统如何排布当前UI元素,它本身不会影响UI的大小或位置,而是为其所在的Layout Group提供布局建议(尺寸、优先级等),从而参与整个UI的自动布局流程

属性含义举例说明
Ignore Layout是否忽略布局系统设置为 true 会让 Layout Group 忽略它
Min Width / Height最小宽高不小于这个尺寸
Preferred Width / Height首选宽高想要的尺寸(如果有空间)
Flexible Width / Height灵活宽高有多大就能占多大,类似“权重” ,多个元素剩余空间分配按权重计算
Layout Priority优先级如果GameObject上有多个布局相关组件,按优先级顺序计算,优先级与数值成正比

常见用途

场景使用方式
某个按钮不想自动拉伸设置 Flexible Width = 0
聊天条自动增长宽度设置 Preferred Width = Text 宽度
图片强制保持比例设置 Preferred Width/Height 同步更新
某个子元素不参与布局勾选 Ignore Layout

Content Size Fitter

Content Size Fitter用于让UI元素根据其子元素或自身内容的大小,自动调整RectTransform的尺寸,是实现响应式UI的关键工具之一

比如:让聊天气泡、弹窗、按钮、文字背景根据内容自动扩展

属性名类型说明
Horizontal Fitenum控制横向尺寸的自动适配方式
Vertical Fitenum控制纵向尺寸的自动适配方式

每个方向的选项有三种:

常见用途

使用场景使用方式
聊天气泡自动撑开Vertical Fit = Preferred Size(文本高度)
Horizontal Fit = Preferred Size(文本宽度)
按钮随文字自适应宽度按钮 Image + Text + ContentSizeFitter
ScrollView 内容自动撑开在 Content 上加 ContentSizeFitter + Layout Group
警告弹窗根据文本自动扩展大小Text + 背景图 + ContentSizeFitter

常见问题

问题原因 & 解决方案
和 LayoutGroup 冲突不要把 ContentSizeFitter 和 LayoutGroup 放在同一个 GameObject 上,要分开:父挂 LayoutGroup,子挂 ContentSizeFitter
内容变了但尺寸没变调用:LayoutRebuilder.ForceRebuildLayoutImmediate(transform as RectTransform) 手动刷新
不生效子物体未使用 LayoutElement 或未正确设置 Preferred Size
UI 抖动动态内容更新太频繁,建议只在必要时刷新布局

示例

动态文字撑开背景
public TextMeshProUGUI messageText;
public RectTransform bubble;

void SetMessage(string msg)
{
  messageText.text = msg;
  LayoutRebuilder.ForceRebuildLayoutImmediate(bubble);
}
聊天列表自动滚到底

搭配ScrollRect

Aspect Ratio Fitter

Aspect Ratio Fitter用于强制一个UI元素保持固定的宽高比(Aspect Ratio),无论父物体如何拉伸、屏幕怎么变化,它都能保持比例不变

通常用于:

属性说明

属性名类型含义
Aspect Mode枚举控制哪个方向跟随调整以维持宽高比
Aspect Ratiofloat目标宽高比(width / height)
Aspect Mode
模式含义
None不启用比例适配
Width Controls Height宽度不变,根据宽度调整高度
Height Controls Width高度不变,根据高度调整宽度
Fit In Parent保持比例并完全包含在父物体内(不裁剪)
Envelope Parent保持比例并覆盖整个父物体(可能裁剪)