2015-10-05 106 views
0

我是Unity的新手,我无法弄清楚如何获得相对于相机或画布的3D GameObject的位置。将画布定位到3D游戏对象(Unity 3D)

我知道Camera.main.ScreenPointToRay(target)可以用来获得GameObject的位置。有没有办法在Camera View或Canvas上获得GameObject的位置?

我已经由刚

  • 做出的替代解决方案移动画布外的图像。

  • 创建定位在目标3D上的盲图像GameObject

但我不喜欢这两个。

回答

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; 
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成分),与左下角为原点。请注意,此屏幕点与所有锚点设置中的定位点无关,此功能起作用!

+0

你没有展示如何定位2D对象,当你这样做时,你可能会发现它不起作用。我知道,就像我自己经历过的那样。 – Droppy

+0

如何定位2D对象?介意澄清你的意思? – David

+0

嗯,我假设OP想要在UI上的位置,以便他可以在该位置放置2D精灵。问题的这一部分不是微不足道的。 – Droppy