unity中RectTransform的position和localPosition说明
在 Unity 里,RectTransform 继承自 Transform,所以它天然拥有 position 和 localPosition 这两个属性。它们的含义和普通 3D 物体的 Transform 一脉相承,但在 UI 系统里又有一些值得留意的细节。
核心区别
-
position(世界坐标)
表示物体在世界空间中的绝对位置。对于 UI 来说,在 Canvas 渲染模式为 Screen Space - Overlay 时,这个值就是屏幕坐标,原点在屏幕左下角,单位是像素,Screen Space - Camera和World Space模式时,单位是3D世界单位。 -
localPosition(本地坐标)
表示物体相对于父物体坐标系的相对位置。它描述的是父物体的轴心点(Pivot)指向当前物体轴心点(Pivot)的向量,单位是像素。
如果物体没有父物体(例如直接在场景根层级),localPosition和position完全一样。
在 RectTransform 中的具体表现
-
受轴心点(Pivot)影响
position和localPosition记录的都是物体自身 Pivot 的位置,而不是物体的几何中心或某个角。
比如一个 100×100 的图片,Pivot 在中心 (0.5, 0.5) 时,position为 (0,0) 表示图片中心在屏幕左下角;如果把 Pivot 改为左下角 (0,0),同样的 (0,0) 就会让图片的左下角对齐屏幕左下角,图片整体会跑到右上方去。 -
与锚点(Anchors)无关
这两个属性不参与锚点计算,它们纯粹是父子 Pivot 之间的相对关系。无论锚点设置成什么样,localPosition的计算始终只依赖父物体的 Pivot 和子物体的 Pivot。 -
UI 中的典型行为
- 当父物体是 Canvas 且 Canvas 中心与子物体 Pivot 重合时,
localPosition为 (0,0,0)。 - 如果父物体是另一个 UI 元素,且父物体的 Pivot 在左下角,子物体 Pivot 在中心,那么子物体的
localPosition就等于 (父物体宽度/2 + 子物体宽度/2, 父物体高度/2 + 子物体高度/2),也就是从父物体左下角到子物体中心的向量。
- 当父物体是 Canvas 且 Canvas 中心与子物体 Pivot 重合时,
什么时候用哪个?
- 需要屏幕绝对定位(比如让 UI 跟随鼠标、或计算 UI 在屏幕上的像素位置)时,用
position。 - 需要相对于父物体布局(比如在代码里动态调整子物体之间的相对位置、制作父子联动的动画)时,用
localPosition。
和 anchoredPosition 别搞混
localPosition 的参照系是父物体的 Pivot,而 anchoredPosition 的参照系是锚点形成的矩形中心。两者都是局部坐标,但原点不同。
简单记:
- 想让元素相对父物体中心定位 → 用
localPosition - 想让元素相对锚点定位(实现自适应边距) → 用
anchoredPosition
如果你在调试时发现 UI 位置乱飞,多半是 Pivot 或父物体的 Pivot 没设对,先检查这两个值往往能快速定位问题。
浙公网安备 33010602011771号