如何获取UI元素的屏幕位置?

时间:2019-07-03 11:54:20

标签: c# user-interface unity3d

我正在尝试获取UI元素的全局位置。

我尝试了很多不同的方法来获得职位,但是似乎没有一个起作用。问题出在锚上,因为我在移动锚,而不是移动UI元素本身的位置(出于分辨率目的),因此在检查器中显示的UI的位置始终为0,0,0。我还尝试获取了anchoredPosition和Corners进行了一些计算,但仍然无法正常工作,我总是得到(0,0,0)或一些不连贯的数字。

 Vector3 pointToTravel = Camera.main.WorldToScreenPoint(objectRectTransform.anchoredPosition);

此“ pointToTravel”变量应将屏幕位置保留在ui元素的像素中。

2 个答案:

答案 0 :(得分:3)

anchoredPosition

  此RectTransform枢轴的

相对于锚参考点的位置。


由于RectTransform继承自Transform,因此您可以简单地使用

Vector3 pointToTravel = Camera.main.WorldToScreenPoint(objectRectTransform.position);

以获得绝对的世界位置。

在检查器中看到的position始终是

  • localPosition for Transform-相对于父级GameObject。

  • anchoredPositionRectTransform,具体取决于锚设置-相对于锚参考点。

但是,如果您的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 无法轻松提供的所有信息,例如屏幕空间位置和非锚定尺寸。