Unity RectTransform 的 anchoredPosition 与 position 属性辨析

问题/目标描述

本文对 Unity UGUI 元素 RectTransform 的 anchoredPosition 与 position 属性进行辨析和举例说明。

针对的软件版本/体系

  • Unity 2018.1.5f1

区别和联系

对于 UGUI 元素来说,RectTransform.anchoredPosition (Vector2) 是相对于anchor来设置的位置。RectTransform.position (Vector3) 是三维坐标(in world space),是相对于世界原点的。

举例说明

已知 e.Position 是触摸或点击事件提供的屏幕坐标(Vector2),Canvas 设置为 Screen Space - Overlay。

如果屏幕是 iPhone7 的大小 667x375,那么点在最右下角的时候,e.Position 的值就是(667, 375)。

如果把按钮的 RectTransform.position 赋值为 e.Position,就能把这个按钮放在屏幕右下角 (667, 375)位置。

如果把按钮的 RectTransform.anchoredPosition 赋值为 e.Position,那么按钮会在哪里取决于 anchor 的位置(参见下图):

  1. 如果 anchor 在左上角(0, 0),那么相对 anchor 设置坐标为 (0, 0) + (667, 375) = (667, 375)
  2. 如果anchor在右下角(667, 375),那么相对 anchor 设置坐标为 (667, 375) + (667, 375) = (1334, 750),设置到屏幕外了。
  3. 其他情况类推。

问题:RectTransform.position 是世界坐标下的 Vector3, e.Position 是屏幕坐标下的 Vector2,为什么从 Vector2 隐式类型转换为 Vector3 后坐标正好是对的?

可能的解释:隐式类型转换时,z = 0。因为 Canvas 是使用 Screen Space - Overlay 模式,元素是绘制在场景之上的,也就是最顶层,z 的数值应该是失效的,只要 x, y 坐标值是对的,元素就会显示在正确的位置。如果有覆盖的问题,可能要设置渲染次序而不是 z 值了。

总结

position 的原点是 Canvas 屏幕空间的原点, anchoredPosition 的原点是元素本身的 anchor。

参考