我正在尝试获取UI元素的全局位置。
我尝试了很多不同的方法来获得职位,但是似乎没有一个起作用。问题出在锚上,因为我在移动锚,而不是移动UI元素本身的位置(出于分辨率目的),因此在检查器中显示的UI的位置始终为0,0,0。我还尝试获取了anchoredPosition和Corners进行了一些计算,但仍然无法正常工作,我总是得到(0,0,0)或一些不连贯的数字。
Vector3 pointToTravel = Camera.main.WorldToScreenPoint(objectRectTransform.anchoredPosition);
此“ pointToTravel”变量应将屏幕位置保留在ui元素的像素中。
答案 0 :(得分:3)
此RectTransform枢轴的相对于锚参考点的位置。
由于RectTransform
继承自Transform
,因此您可以简单地使用
Vector3 pointToTravel = Camera.main.WorldToScreenPoint(objectRectTransform.position);
以获得绝对的世界位置。
在检查器中看到的position
始终是
localPosition
for Transform
-相对于父级GameObject。
或
anchoredPosition
为RectTransform
,具体取决于锚设置-相对于锚参考点。 但是,如果您的Canvas是Screenspace Overlay
个包含的所有UI(或更佳的RectTransform
)已经使用了像素的屏幕空间坐标>,因此WorldToScreenPoint
是不必要的,或者更好的说法是返回错误的值。
因此,在这种情况下,您可以简单地使用
Vector3 pointToTravel = objectRectTransform.position;
答案 1 :(得分:0)
为了从 RectTransform 中获取有关 UI 元素尺寸和位置的任何信息,我编写了这个小实用函数来将 RectTransform
转换为屏幕空间 - Rect
(对于画布模式屏幕空间 - 相机)。
public static Rect RectTransformToScreenSpace(RectTransform transform, Camera cam, bool cutDecimals = false)
{
var worldCorners = new Vector3[4];
var screenCorners = new Vector3[4];
transform.GetWorldCorners(worldCorners);
for (int i = 0; i < 4; i++)
{
screenCorners[i] = cam.WorldToScreenPoint(worldCorners[i]);
if (cutDecimals)
{
screenCorners[i].x = (int)screenCorners[i].x;
screenCorners[i].y = (int)screenCorners[i].y;
}
}
return new Rect(screenCorners[0].x,
screenCorners[0].y,
screenCorners[2].x - screenCorners[0].x,
screenCorners[2].y - screenCorners[0].y);
}
从这个矩形中,您可以轻松获得 RectTransform
无法轻松提供的所有信息,例如屏幕空间位置和非锚定尺寸。