当我自由移动相机时,我正在尝试通过UI中的立方体显示文本显示。画布设置为屏幕空间 - 相机模式,我将相机属性设置在检查员中。我还将鼠标移动脚本附加到相机上。
我的问题是文本几乎没有动,似乎忽略了立方体相对于相机的视口的位置。这是我的代码:
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;
}
}
首先,您可以使用world
相机查看cube
,塞入3D对象,然后其他摄像机ui
查看您的UI元素,同时删除3D对象。最后,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.
urp的工作解决方案(也适用于删除(:
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);
}
USCQ答案对我有用。但是,我需要了解我画布中UI图像的世界位置。我的画布正在使用屏幕空间 - 相机而不是叠加。我修改了USCQ的答案,以做相反的事情。非常感谢!
var position = UICamera.WorldToScreenPoint(MyUIObject.transform.position);
position.z = (thisCanvas.transform.position - UICamera.transform.position).magnitude;
theLocationOfUIObjectInWorldLocation = Camera.main.ScreenToWorldPoint(position);
void LateUpdate () {
element.anchoredPosition = Input.mousePosition;
}
并将元素的锚点设置为vector22.zero,min和最大