查找Unity UI元素的世界空间坐标

时间:2015-05-07 14:12:49

标签: user-interface unity3d

因此,根据Unity文档RectTransform.anchoredPosition,如果锚点在RectTransform的轴心点处接触,则会返回UI元素的屏幕坐标。但是,如果它们是分开的(在我的情况下位于矩形的角落),它们将为您提供锚点相对于枢轴点的位置。除非您想通过多种分辨率保持UI对象的适当尺寸并同时根据该位置定位不同的对象,否则这很棒。

让我们打破这个。我有object1和object2。 object1位于(322.5,-600),当锚点在对象的中心(枢轴)相遇时,anchoredPosition返回,而object2的位置就好了。另一方面,一旦我将锚点放置在object1的4个角上,anchoredPosition返回(45.6,-21)。多数民众赞成没有好处。我甚至尝试过使用Transform.position然后使用Camera.WorldToScreenPoint(),但这对于让我达到目标几乎同样重要。

我希望你能帮助我找到一种方法来获得这个物体的实际屏幕坐标。如果有人对此主题有任何见解,我们将不胜感激。

注意:我已经尝试使用RectTranfrom.rect.center并返回(0,0)

我也调查了RectTransformUtility,那些辅助函数完成了所有的下蹲。

4 个答案:

答案 0 :(得分:5)

anchoredPosition返回"此RectTransform的枢轴相对于锚点参考点的位置。"它与屏幕坐标或世界空间无关。

如果您要在Unity中查找UI元素的屏幕坐标,可以使用rectTransform.TransformPointrectTransform.GetWorldCorners获取Vector3 s中的任何一个&#39} ; d需要在世界空间。您决定使用它,然后可以将它们传递到Camera.WorldToScreenPoint()

答案 1 :(得分:1)

以下是关于如果您遇到并需要将自己的视角从视图空间转移到世界空间时如何找到UI元素的世界空间坐标的一瞥。

如果你需要的东西比rectTransform.TransformPoint更多或者想知道它是如何工作的,那么这可能是有益的。

好的,所以你想要从[-1,1]范围内的标准化UI坐标进行转换,然后将它们反投影回世界空间坐标。

要做到这一点,你可以使用像Camera.main.ScreenToWorldPoint或Camera.main.ViewportToWorldPoint,甚至rectTransform.position,如果你的缺乏。

这是如何使用相机的投影矩阵来完成的。

/// <summary>
/// Get the world position of an anchor/normalised device coordinate in the range [-1, 1]
/// </summary>
private Vector3 GetAnchor(Vector2 ndcSpace)
{
    Vector3 worldPosition;

    Vector4 viewSpace = new Vector4(ndcSpace.x, ndcSpace.y, 1.0f, 1.0f);

    // Transform to projection coordinate.
    Vector4 projectionToWorld = (_mainCamera.projectionMatrix.inverse * viewSpace);

    // Perspective divide.
    projectionToWorld /= projectionToWorld.w;

    // Z-component is backwards in Unity.
    projectionToWorld.z = -projectionToWorld.z;

    // Transform from camera space to world space.
    worldPosition = _mainCamera.transform.position + _mainCamera.transform.TransformVector(projectionToWorld);

    return worldPosition;
}

答案 2 :(得分:0)

我发现您可以将坐标乘以相机尺寸的2倍并将其除以屏幕高度。

我有一个面板放在(0,1080)全高清屏幕(1920 x 1080),相机尺寸为7.所以世界空间的Y坐标为1080 * 7 * 2 / 1080 = 14 -> (0, 14).

答案 3 :(得分:0)

ScreenToWorldPoint将画布位置转换为世界位置:

main