如何将RectTransform(UI面板)转换为屏幕坐标?

8

我想要确定在Unity3D中RectTransform的屏幕坐标。考虑到元素可能会被锚定或缩放,应该如何完成此操作?

我试图使用RectTransform.GetWorldCorners,然后将每个Vector3转换为屏幕坐标,但是值是错误的。

public Rect GetScreenCoordinates(RectTransform uiElement)
{
    var worldCorners = new Vector3[4];
    uiElement.GetWorldCorners(worldCorners);
    var result = new Rect(
        worldCorners[0].x,
        worldCorners[0].y,
        worldCorners[2].x - worldCorners[0].x,
        worldCorners[2].y - worldCorners[0].y);
    for (int index = 0; index < 4; index++)
        result[index] = Camera.main.WorldToScreenPoint(result[index]);
    return result;
}

我被某个可悲的人跟踪和恶意降低评分。你知道,你的行为只会让人们不愿使用这个网站,而且考虑到我经常发布自己问题的答案,让我删除我的问题并离开对网站用户没有好处。 - Peter Morris
1
发布自己问题的答案可获得1000万美元!您是一个好人™。 - darbotron
1个回答

13

虽然文档说返回的是世界空间坐标,但实际上返回的是屏幕空间坐标(至少在UI不在世界空间时如此)。因此解决方案很简单:

public Rect GetScreenCoordinates(RectTransform uiElement)
{
  var worldCorners = new Vector3[4];
  uiElement.GetWorldCorners(worldCorners);
  var result = new Rect(
                worldCorners[0].x,
                worldCorners[0].y,
                worldCorners[2].x - worldCorners[0].x,
                worldCorners[2].y - worldCorners[0].y);
  return result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接