将游戏对象从画布定位到3D游戏对象(Unity 3D)

时间:2015-10-05 10:18:20

标签: unity3d

我是Unity的新手,我无法弄清楚如何获得3D GameObject相对于相机或画布的位置。

我知道Camera.main.ScreenPointToRay(target)可用于获取GameObject的位置。有没有办法在相机视图或画布上获得GameObject的位置?

我已经通过

制定了替代解决方案
  • 将图像移出画布。

  • 创建位于目标3D GameObject上的盲图像。

但我不喜欢两者。

2 个答案:

答案 0 :(得分:1)

我最近花了一些时间来解决这个问题。我的目的是在3D世界对象上放置一个2D箭头,并使用Camera.WorldToViewportPoint()RectTransform.anchorMin/Max找到最佳解决方案。

请注意,视点是规范化的(0.0 - 1.0),而不是绝对像素位置:

Vector3 screenPos = Camera.main.WorldToViewportPoint(someObject.transform.position);
arrowImage.rectTransform.anchorMin = screenPos;
arrowImage.rectTransform.anchorMax = screenPos;

答案 1 :(得分:0)

如果您想将游戏对象的位置投影到画布上,请使用以下代码:

var pos = gameObject.transform.position;
var vec2 = RectTransformUtility.WorldToScreenPoint(camera, pos);
Debug.Log(vec2);

enter image description here

在另一种情况下,如果您想获取UI游戏对象的屏幕坐标,请尝试以下:

public static List<Vector2> GetScreenCoordinateOfUIRect(RectTransform rt)
{
    Vector3[] corners = new Vector3[4];
    rt.GetWorldCorners(corners);

    var output = new List<Vector2>();
    foreach (Vector3 item in corners)
    {
        var pos = RectTransformUtility.WorldToScreenPoint(null, item);
        output.Add(pos);
    }
    return output;      
}

通过这种方式,您可以获得UI游戏对象(具有RectTransform组件的人)的屏幕点,左下角为原点。请注意,此屏幕点与锚点无关,在所有锚点设置中,此功能都有效!