Rect Transform

目录

[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 只在回答两个问题

忘掉所有公式,它其实就两步:

  1. 我在父物体上"认领"哪块地? ← 这是 Anchors(锚框)
  2. 我在这块地里怎么摆? ← 这是 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 这个线段上按比例插值出来的位置,不再是一个固定角,所以数值看着会"飘"。

相关推荐
极验1 小时前
全能注册机之后,游戏风控的战场变了
游戏
淡海水6 小时前
07-01-源码-.NET Core GC总览与架构
unity·架构·c#·.netcore·gc
true...10 小时前
虚幻里面设置物体显示、隐藏的两种方式
游戏引擎·虚幻
电子云与长程纠缠1 天前
UE5魂系游戏开发教程05
开发语言·学习·游戏·ui·ue5
夜晚の星光11 天前
一线显卡品牌有哪些?从硬件标准化与高端产品布局观察市场新格局
游戏
淡海水1 天前
06-03-源码-时间分片与调度策略
unity·c#·gc
郝学胜-神的一滴2 天前
游戏设计:原型与开发 08:我们到底在为谁做游戏
程序人生·游戏·游戏引擎·游戏开发·游戏策划
五仁烧饼2 天前
动手学 Shader Graph(二):溶解与边缘发光
游戏·unity·shader·shader graph
淡海水2 天前
06-02-源码-增量标记算法实现
算法·unity·c#·gc