统一3d。如何获取ui元素的屏幕或世界位置

Posted

技术标签:

【中文标题】统一3d。如何获取ui元素的屏幕或世界位置【英文标题】:Unity3d. How to get screen or world position of ui element 【发布时间】:2015-04-24 13:17:52 【问题描述】:

我有 UI 元素(图像等)。画布连接到相机。 有一个RectTransform,但是如何将此数据转换为屏幕或世界坐标并获取此图像的中心点?

尝试了RectTransform.GetWorldCorners,但它返回零向量。

【问题讨论】:

【参考方案1】:

yourRectTransform.rect.center 表示局部空间的中心点。

yourRectTransform.TransformPoint 转换为世界空间。

奇怪的是RectTransform.GetWorldCorners 没有按说明工作。根据您需要在 Awake 之后调用的其他答案之一(因此可以进行布局)。

【讨论】:

谢谢华卡纳查。正是我需要的 我搜索了这么多小时才找到yourRectTransform.TransformPoint(Vector3)....非常感谢! 确实,我根本无法让RectTransform.GetWorldCorners 工作:下面 Kay 报告说,它似乎只有在画布是世界空间样式时才有效。【参考方案2】:

我发现 GetWorldCorners 和 TransformPoint 都只能在 Start() 上工作,而不能在 Awake() 上工作,好像我们必须等待内容调整大小

    Vector3 min = referenceArea.rectTransform.TransformPoint(referenceArea.rectTransform.rect.min);
    Vector3 max = referenceArea.rectTransform.TransformPoint(referenceArea.rectTransform.rect.max);

    elementToResize.transform.localScale = new Vector3(Mathf.Abs(min.x - max.x) , Mathf.Abs(min.y - max.y), 1f);
    elementToResize.transform.position = referenceArea.rectTransform.TransformPoint(referenceArea.rectTransform.rect.center);

【讨论】:

【参考方案3】:

您可以使用GetWorldCorners,但只能在使用具有真实尺寸的子级时使用。对于世界空间画布的孩子,我得到了合理的值。

【讨论】:

【参考方案4】:

按照华卡纳查的指导,

Vector2 _centerPosition = _rectTransform.TransformPoint(_rectTransform.rect.center);

会给你图像中心的世界坐标。

【讨论】:

以上是关于统一3d。如何获取ui元素的屏幕或世界位置的主要内容,如果未能解决你的问题,请参考以下文章

如何获取子对象的全局/世界位置?

jQuery获取元素相对于窗口的位置

Unity UI跟随3D物体,世界坐标转UI坐标

如何获得子对象的全局/世界位置?

如何在 c# 中使用统一组合网格并获取相对于主父级的点击位置

如何获取CAKeyframeAnimation对象的当前屏幕xy位置?