将世界位置定位到屏幕空间的画布位置 - 相机画布



当我自由移动相机时,我正在尝试通过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和最大

最新更新