我是Unity的新手,我无法弄清楚如何获得相对于相机或画布的3D GameObject
的位置。将画布定位到3D游戏对象(Unity 3D)
我知道Camera.main.ScreenPointToRay(target)
可以用来获得GameObject
的位置。有没有办法在Camera View或Canvas上获得GameObject
的位置?
我已经由刚
做出的替代解决方案移动画布外的图像。
创建定位在目标3D上的盲图像
GameObject
。
但我不喜欢这两个。
我是Unity的新手,我无法弄清楚如何获得相对于相机或画布的3D GameObject
的位置。将画布定位到3D游戏对象(Unity 3D)
我知道Camera.main.ScreenPointToRay(target)
可以用来获得GameObject
的位置。有没有办法在Camera View或Canvas上获得GameObject
的位置?
我已经由刚
做出的替代解决方案移动画布外的图像。
创建定位在目标3D上的盲图像GameObject
。
但我不喜欢这两个。
我最近花了一些时间处理这个问题。我的目的是在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;
如果你想获得游戏中物体的位置投射到画布上,使用下面的代码:
var pos = gameObject.transform.position;
var vec2 = RectTransformUtility.WorldToScreenPoint(camera, pos);
Debug.Log(vec2);
在另一种情况下,如果你想获得的一个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成分),与左下角为原点。请注意,此屏幕点与所有锚点设置中的定位点无关,此功能起作用!
你没有展示如何定位2D对象,当你这样做时,你可能会发现它不起作用。我知道,就像我自己经历过的那样。 – Droppy
如何定位2D对象?介意澄清你的意思? – David
嗯,我假设OP想要在UI上的位置,以便他可以在该位置放置2D精灵。问题的这一部分不是微不足道的。 – Droppy