【问题标题】:Not able to get real position of an object in a Canvas with "Screen Space Overlay"无法使用“屏幕空间叠加”在画布中获取对象的真实位置
【发布时间】:2023-04-05 19:56:01
【问题描述】:

我有一个屏幕顶部有一个 BAR 的手机游戏。该栏及其游戏对象位于具有“屏幕空间 - 叠加”模式的画布中,以及具有“按屏幕大小缩放”的缩放模式的画布缩放器,并且匹配等于“匹配宽度或高度”。

我正在将一个游戏对象设置为其中一个对象的位置,并且该对象完全离开了屏幕(真的很远)。

我正在尝试使用下面的代码获取对象的位置。

即便如此,返回的位置还是屏幕的完整。知道我做错了什么吗?

    public Vector3 getObjectPosition()
{
    // Getting my CANVAS
    Camera cam = Camera.main;
    GameObject canvasOverlayObject = GameObject.Find("CanvasOverlay");
    Canvas canvas = canvasOverlayObject.GetComponent<Canvas>();

    //Manual scalling the CANVAS
    float canvasScaleX = Screen.width / canvasOverlayObject.GetComponent<CanvasScaler>().referenceResolution.x;
    float canvasScaleY = Screen.height / canvasOverlayObject.GetComponent<CanvasScaler>().referenceResolution.y;

    return Camera.main.ScreenToWorldPoint(new Vector3(transform.position.x / canvas.scaleFactor, transform.position.y / canvas.scaleFactor, 0));
}

【问题讨论】:

  • Camera.main.ScreenToWorldPoint(new Vector3(transform.position.x / canvas.scaleFactor, transform.position.y / canvas.scaleFactor, 0)); 中,您在任何地方都没有使用任何之前计算的值.. 请注意,您应该始终传入z 的值而不是0 前面有一定距离的位置相机。
  • 感谢您的提示 derHugo,这是找到答案的关键。

标签: unity3d unity3d-gui


【解决方案1】:

即使使用缩放的画布也不需要缩放,只需将 gameobject.tranform.position 作为参数传递。

public Vector3 getPosition()
{
    Camera cam = Camera.main;
    GameObject canvasOverlayObject = GameObject.Find("CanvasOverlay");
    Canvas canvas = canvasOverlayObject.GetComponent<Canvas>();

    Vector3 rawPosition = Camera.main.ScreenToWorldPoint(gameObject.transform.position);

    return rawPosition;
}

【讨论】:

  • 这个工作的原因是您的对象显然已经是ScreenSpace - Overlay 画布的子对象,因此它的位置在屏幕像素坐标中。获取canvasOverlayObjectcanvas 仍然没有意义,因为它们从未使用过,只是使用昂贵且冗余的 API 调用;)
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多