当我自由移动相机时,我正试图在Unity UI中的立方体上显示文本。画布设置为Screen Space - Camera模式,我在检查器中设置了camera属性。我还附加了一个鼠标移动脚本到相机。
我的问题是,文本几乎没有移动,似乎忽略了立方体相对于相机视口的位置。下面是我的代码:
public class UpdateUiMarker : MonoBehaviour {
public RectTransform element;
public Transform cube;
public RectTransform canvas;
// Update is called once per frame
void LateUpdate () {
Vector2 screenPos = Camera.main.WorldToScreenPoint(cube.position);
Vector2 localPos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, screenPos, Camera.main, out localPos);
element.localPosition = localPos;
}
}发布于 2019-05-24 19:54:54
首先,您可以让world相机查看填充为3D对象的cube,然后其他Camera ui在剔除3D对象时查看您的UI元素。最后,canvas画布放置您的UI元素。然后,您可以像这样编写代码:
var screen = world.WorldToScreenPoint(cube.transform.position);
screen.z = (canvas.transform.position - ui.transform.position).magnitude;
var position = ui.ScreenToWorldPoint(screen);
element.position = position; // element is the Text show in the UI.发布于 2021-08-09 07:26:27
URP的工作解决方案(也适用于deffered):
public static Vector2 WorldPositionToScreenSpaceCameraPosition(Camera worldCamera, Canvas canvas, Vector3 position)
{
Vector2 viewport = worldCamera.WorldToViewportPoint(position);
Ray canvasRay = canvas.worldCamera.ViewportPointToRay(viewport);
return canvasRay.GetPoint(canvas.planeDistance);
}发布于 2021-09-22 21:33:39
uscq answer对我很有效。然而,我需要知道在我的画布中的UI Image的世界位置。我的画布使用的是屏幕空间-相机,而不是覆盖。我修改了uscq answer来做相反的事情。非常感谢!
var position = UICamera.WorldToScreenPoint(MyUIObject.transform.position);
position.z = (thisCanvas.transform.position - UICamera.transform.position).magnitude;
theLocationOfUIObjectInWorldLocation = Camera.main.ScreenToWorldPoint(position);https://stackoverflow.com/questions/44399551
复制相似问题