目录
[Anchor Presets(锚点预设)面板](#Anchor Presets(锚点预设)面板)
[Anchors(锚点)Min X 0 / Y 1,Max X 0 / Y 1](#Anchors(锚点)Min X 0 / Y 1,Max X 0 / Y 1)
[模式二:双轴全拉伸(X、Y 都拉开)](#模式二:双轴全拉伸(X、Y 都拉开))
[Pivot(轴心)0.5, 0.5](#Pivot(轴心)0.5, 0.5)
[Pos X 752.3 / Pos Y -395 / Pos Z 0](#Pos X 752.3 / Pos Y -395 / Pos Z 0)
[Width 500 / Height 280](#Width 500 / Height 280)
[Rotation 0,0,0 与 Scale 1,1,1](#Rotation 0,0,0 与 Scale 1,1,1)
[Pivot 和锚点有关系吗?](#Pivot 和锚点有关系吗?)
[混合模式 + 比例锚的一个叠加案例](#混合模式 + 比例锚的一个叠加案例)
[第 0 步:Rect Transform 只在回答两个问题](#第 0 步:Rect Transform 只在回答两个问题)
[第 1 步:锚框 = 你在父物体上"圈一块地"](#第 1 步:锚框 = 你在父物体上"圈一块地")
[第 2 步:为什么圈出"一条线"也有用?](#第 2 步:为什么圈出"一条线"也有用?)
[第 3 步:只看 X 轴(现在把 Y 完全忘掉)](#第 3 步:只看 X 轴(现在把 Y 完全忘掉))
[第 4 步:只看 Y 轴(现在把 X 完全忘掉)](#第 4 步:只看 Y 轴(现在把 X 完全忘掉))
[第 5 步:父物体变高会怎样?](#第 5 步:父物体变高会怎样?)
[第 6 步:Pivot 在这里管什么](#第 6 步:Pivot 在这里管什么)
[什么时候 Pivot Y 才会真正影响布局数字?](#什么时候 Pivot Y 才会真正影响布局数字?)
[sizeDelta 的陷阱(拉伸模式下必踩)](#sizeDelta 的陷阱(拉伸模式下必踩))
[API 对照速查](#API 对照速查)
**Rect Transform 的所有数值,全都是相对于父物体算的,没有一个是绝对屏幕坐标。** 这是 UI 布局和普通 3D Transform 最大的区别。
Anchor Presets(锚点预设)面板

点锚(不含 stretch 的 9 格)
四个锚点重合在一个点上 → Inspector 显示 Pos X / Pos Y / Width / Height。
无论父物体怎么变,子物体元素大小不变,只保持相对那个点的偏移。做固定尺寸的按钮、图标、格子就用这个。
拉伸锚
只要横或纵带一个 stretch
锚点在该方向上被拉开成了线段 → 那两个方向的字段就变成 Left / Right (或 Top / Bottom ),含义是**"元素这条边距离父物体对应边的间距"**。父物体变大,元素跟着被拉大。做全屏背景、顶栏血条、铺满面板的内容区就用这个。

Shift: Also set pivot ------ 按住 Shift 点击,除了设锚点,还把 Pivot 挪到和锚点相同的位置。比如 Shift 点左上角,Pivot 就变成 (0, 1)。旋转、缩放、以及 Pos 的度量原点都会跟着变。
Alt: Also set position ------ 按住 Alt 点击,除了设锚点,还会把元素当前的位置/尺寸重新换算,让它在屏幕上的视觉位置和大小保持不变。这是最实用的一个:你想把元素从"贴左上角"改成"贴右下角"但不想让它乱跑,就 Alt + 点击右下角那格。
Anchors(锚点)Min X 0 / Y 1,Max X 0 / Y 1

锚点不是只有"点"这一种,按 Min/Max 是否重合分两大类,再因为 X 轴和 Y 轴独立判断,实际能组合出三种显示形态。而且 Min/Max 还能填任意小数,不只是 0 / 0.5 / 1
Unity 是逐轴判断的,规则就两条:
| 条件 | 该轴显示 |
|---|---|
anchorMin.x == anchorMax.x |
Pos X + Width |
anchorMin.x != anchorMax.x |
Left + Right |
anchorMin.y == anchorMax.y |
Pos Y + Height |
anchorMin.y != anchorMax.y |
Top + Bottom |
模式一:点锚
四个锚点挤在一个点
显示 Pos X / Pos Y / Width / Height,尺寸写死,父物体变形时元素只平移、不变形。
模式二:双轴全拉伸(X、Y 都拉开)
显示 Left / Right / Top / Bottom,这四个值是"元素每条边距离父物体对应边多少像素"。全设 0 就是完全填满。
父物体变大,元素四个方向同时被拉开。做全屏背景、遮罩、铺满面板的内容区。
模式三:混合(一个轴点锚、一个轴拉伸)
这是最有用但最常被忽略的一种,九宫格里带一个 stretch 的 8 个格子都是它。
显示 Pos X + Width + Top + Bottom(或反过来 Left + Right + Pos Y + Height)。
行为:父物体变高 → 子元素跟着变高;父物体变宽 → 子元素宽度不变,只是横向平移。
模式四:任意比例锚
Min/Max 不必是 0、0.5、1,Inspector 里可以直接手输任意 0~1 的小数。只要不相等,就算拉伸,但增长不是 1:1 的:
Pivot(轴心)0.5, 0.5
Pivot 是这个物体自身的原点 ,取值 0~1 是自身矩形内的归一化坐标。
(0.5, 0.5)= 正中心,也就是:
- 旋转、缩放都以中心为支点;
- 更重要的是:Pos X / Pos Y 测量的正是 Pivot 点相对于锚点的偏移。
Pos X 752.3 / Pos Y -395 / Pos Z 0
这三个值对应脚本里的
anchoredPosition:
- Pos X = 752.3 :Pivot(中心)在锚点(父物体左上角)右边 752.3 像素。
- Pos Y = -395 :Pivot 在锚点下方 395 像素(Y 轴向上为正,所以向下是负数)。
- Pos Z = 0:localPosition.z,UI 里基本不用。它不影响排序和遮挡(层级由 Hierarchy 顺序 / Sorting Order 决定),只有在 World Space Canvas、或者要做 3D 翻转、写自定义 shader 时才会有实际意义。
Width 500 / Height 280
对应脚本里的
sizeDelta,即元素自身的宽高,单位是 UI 像素(受 Canvas Scaler 缩放影响,不一定是屏幕物理像素)。点锚模式下 sizeDelta 就等于实际尺寸,不会随父物体缩放。
Rotation 0,0,0 与 Scale 1,1,1
- Rotation :绕自身 Z 轴旋转(UI 常用的就这一个轴),以 Pivot 为中心。改它不会触发 Layout 重建,只是重新计算顶点。
- Scale:以 Pivot 为中心的缩放,会影响自身及所有子物体,同样不触发布局重建。
什么叫做锚框?疑问???
锚框(anchor box / anchor rect)就是 anchorMin 和 anchorMax 这两个点在父矩形里撑出来的那个矩形。
它是 Rect Transform 里所有间距计算的参照区域 ------所有 Left / Right / Top / Bottom 量的都是"元素边框 与 锚框 之间的距离",不是与父物体边缘的距离。
它长什么样
anchorMin 是左下角,anchorMax 是右上角,两点撑出一个矩形:
父物体 1000 × 600,anchorMin=(0.2, 0.1),anchorMax=(0.8, 0.9)

点锚时,锚框退化成一个点
锚框永远存在,只是可能没有面积
本质是同一件事
| 锚框状态 | 该轴显示 | 因为 |
|---|---|---|
| 宽 = 0(点) | Pos X + Width | 参照物是点,说"位置+尺寸"更自然 |
| 宽 > 0(框) | Left + Right | 参照物是框,说"离两条边各多远"更自然 |
锚框的两个作用
作用一:定义"间距从哪量起"
父 1000 × 600,锚框 (0,0)~(1,1),Left = Right = 20

父 1000 × 600,锚框 (0.2,0)~(0.8,1),Left = Right = 20

"尺寸不是简单父宽 − 间距"的原因:间距是从锚框边量起的,锚框本身只占父物体的 60%。
// 通用公式
实际宽度 = (anchorMax.x − anchorMin.x) × 父宽 − Left − Right
实际高度 = (anchorMax.y − anchorMin.y) × 父高 − Top − Bottom
作用二:定义"跟着父物体缩放的比例"
锚框的相对宽度 (anchorMax.x − anchorMin.x) 就是跟随系数,我叫它 span:
| span.x | 父宽 +100 时,子元素宽度 |
|---|---|
| 0(点锚) | 不变 |
| 0.6 | +60 |
| 1(全拉伸) | +100 |
Pivot 和锚点有关系吗?
| 数值 | 由谁决定 | |
|---|---|---|
| Anchors Min/Max | (0, 1) | 锚点:参照系原点在父物体身上 |
| Pivot | (0, 0) | Pivot:原点在子元素自己身上 |
锚点是"外"的参照系 (父矩形里的一个归一化位置 0~1),Pivot 是"内"的参照系(自身矩形里的一个归一化位置 0~1)。你随便改任何一个,另一个的数值都不会动、也不会变灰。
但有一个唯一的交集:点锚模式下,Pos X / Pos Y 的"测量终点"就是 Pivot。
Pos X / Pos Y 量的不是「锚点 → 子元素左边」
Pos X / Pos Y 量的是「锚点 → Pivot 点」
锚点在上边缘 → Pos Y 要填负数才能进到父物体里面。

说了什么?
四个小三角全部挤在左上角 → 锚点是点锚,位置 left + top
**"left" / "top"** 字样,就是 Unity 在告诉当前子物体相对于父物体的对齐方式:水平靠左、垂直靠上

预览图:三角在左上 ←→ Anchors Min (0,1) / Max (0,1)
预览图:三角在正中 ←→ Anchors Min (0.5,0.5) / Max (0.5,0.5)
预览图:四角拉开 ←→ Min (0,0) / Max (1,1)
改预览图 → Anchors 数值变;改 Anchors 数值 → 预览图变。永远同步。
混合模式 + 比例锚的一个叠加案例

先判断:这是哪种模式?
Unity 逐轴判断,你这两个轴的结论不一样:
| 轴 | Anchors | 判断 | 显示 |
|---|---|---|---|
| X | Min X = 1 ,Max X = 1 | 相等 → 点锚 | Pos X + Width |
| Y | Min Y = 0.5 ,Max Y = 1 | 不等 → 拉伸 | Top + Bottom |
第 0 步:Rect Transform 只在回答两个问题
忘掉所有公式,它其实就两步:
- 我在父物体上"认领"哪块地? ← 这是 Anchors(锚框)
- 我在这块地里怎么摆? ← 这是 Pos/Width 或 Top/Bottom
第 1 步:锚框 = 你在父物体上"圈一块地"
Min 和 Max 是两个对角点,圈出来的矩形就是锚框。

假设父物体 1000 × 900
Min = (1, 0.5) → x = 1×1000 = 1000, y = 0.5×900 = 450
Max = (1, 1) → x = 1×1000 = 1000, y = 1×900 = 900
圈出来是什么?看这两个点:
- x:1000 → 1000,完全一样,圈不出宽度
- y:300 → 600,圈出了 300px 高
所以圈出来的是一条竖线,不是一个面
第 2 步:为什么圈出"一条线"也有用?
因为两个轴的需求不一样:
- X 轴 :我想宽度固定 200,不需要地,只需要一个"钉子"钉住位置 → 所以 x 圈成点(宽度 0)刚好
- Y 轴 :我想高度跟着父物体变,需要地来撑开自己 → 所以 y 圈出 300px 的地
**锚框在哪个轴上"有宽度",哪个轴就是拉伸模式。** 这就是 Unity 逐轴判断的全部逻辑。
第 3 步:只看 X 轴(现在把 Y 完全忘掉)

因为 x 是"点"(Min = Max = 1),所以 X 轴是点锚,Inspector 给你两个框:
Pos X = 从那条线,量到我的 Pivot
Pivot X = 0.5,也就是量到我的水平中心。
Width = 我自己多宽(你=填了 200,写死)
假设 Pos X = −150(负号 = 向左),算一下:
中心 = 1000 + (−150) = 850
左边 = 850 − 100 = 750 (100 = 半个宽度)
右边 = 850 + 100 = 950

结论:宽度永远 200,父物体变宽也不变。
第 4 步:只看 Y 轴(现在把 X 完全忘掉)

纵向锚框是从 y=450 到 y=900 这 300px。
因为 y 是"有长度的"(0.5 ≠ 1),所以 Y 轴是拉伸,Inspector 给你两个框:
Top = 从锚框【上边】(y=900) 往下量到我的上边缘
Bottom = 从锚框【下边】(y=450) 往上量到我的下边缘
设 Top = 50、Bottom = 20:

最关键的一点:Bottom 不是"离父底边多远",是"离锚框下边(y=300)多远"。
所以高度是 900-450-50-20=380 ,不是 900−50-20=830。因为锚框只占了 900~450 这一段,不是整个父物体高度
第 5 步:父物体变高会怎样?
父物体从 900 涨到 1200,锚框跟着重算:
原来:y 从 450 到 900 (锚框高 450)
现在:y 从 600 到 1200 (锚框高 600)
Top 和 Bottom 不变(还是 50 和 20):
原来:
变高:

为什么只涨一半? 因为锚框只占父物体高度的 0.5(从 0.5 到 1)。这就是"比例锚"——锚框占多少比例,元素就按多少比例跟随。
第 6 步:Pivot 在这里管什么
| 场景 | Pivot Y = 0 vs 0.5 | 有没有差别 |
|---|---|---|
| 布局(Top / Bottom / 元素位置 / 高度) | 没用 | 一个数都不变 |
| 缩放(Scale) | 有用 | 往哪边长不一样 |
| 旋转(Rotation) | 有用 | 绕哪儿转不一样 |
Pivot Y = 0,父物体高900 1200



Pivot Y = 0.5,父物体高900 1200



Top / Bottom 不受Pivot的影响
拉伸模式下,Top / Bottom 量的是**「边 到 边」**:
Top = 锚框上边(y=600) → 元素上边缘
Bottom = 锚框下边(y=300) → 元素下边缘
量的是两条边 之间的距离。而 Pivot 是元素内部的一个点。
**边没动,距离就不动。** 你在房间里站中间还是站墙角,外墙到地界的距离都不变。
唯一变化的就是 Pivot 那个点自己在元素内部的位置。
什么时候 Pivot Y 才会真正影响布局数字?
只有 Y 轴是点锚时。
把 Anchors Min Y 改成 1(和 Max Y 相等),面板会从 Top / Bottom 变成 Pos Y / Height------这时候 Pivot Y 才有影响:
sizeDelta 的陷阱(拉伸模式下必踩)
脚本里 rectTransform.sizeDelta 的语义随模式变化:
| 模式 | sizeDelta 含义 |
|---|---|
| 点锚 | 就是 (Width, Height) 直觉正确 |
| 拉伸 | 是 -(Left+Right, Top+Bottom) 完全反直觉 |
跨模式安全写法:
// 改实际尺寸(两种模式都正确)
rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 500);// 拉伸模式下改边距,用这个
rt.offsetMin = new Vector2(left, bottom); // 左下角偏移
rt.offsetMax = new Vector2(-right, -top); // 右上角偏移,注意负号// 只想读当前真实宽高,用这个(永远是实际像素)
float w = rt.rect.width;
API 对照速查
| Inspector 字段 | 脚本属性 |
|---|---|
| Anchors Min/Max | anchorMin / anchorMax |
| Pos X / Pos Y | anchoredPosition |
| Width / Height | sizeDelta(仅点锚时) |
| Left / Bottom | offsetMin |
| Right / Top | 负的 offsetMax |
| Pivot | pivot |
拉伸模式下 anchoredPosition 依然能读写,只是它的参考点变成了 Pivot 在 anchorMin→anchorMax 这个线段上按比例插值出来的位置,不再是一个固定角,所以数值看着会"飘"。