【问题标题】:How to get proper Z position of a gameObject when using ScreenToWorldPoint?使用 ScreenToWorldPoint 时如何获得游戏对象的正确 Z 位置?
【发布时间】:2018-08-07 07:24:14
【问题描述】:

我以为我以前有解决问题的方法,但它似乎没有达到应有的效果。基本上,我想使用鼠标在 3D 中移动游戏对象,同时保持 Z 位置不变。如果我单击并拖动游戏对象,它应该跟随光标而不改变其位置的深度。

我的代码是这样的:

screenSpace = Camera.main.WorldToScreenPoint(transform.position);
mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
mouseInWorld = Camera.main.ScreenToWorldPoint(mousePosition);

这效果很好,但是每次我移动对象时深度都会发生轻微的变化。如果我只是这样做,为什么 Unity 不起作用:

mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, gameObject.transform.position.z);

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    造成这种情况的潜在原因有很多,但最常见的是启用了刚体或碰撞器,它以某种形式与导致目标对象移动的环境交互。

    尝试将 mousePosition 设置为 0:

    mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);
    

    如果这工作正常,那么通过物理系统或其他组件等存在某种形式的干扰正在改变 Z 位置。

    请记住,手动修改对象位置很大程度上取决于您何时更新它。

    如果不是这种情况,请随时向我提供更多信息,我会尽力回复您。

    【讨论】:

    • 抱歉,我的问题可能有点奇怪。让我试着解释一下。如果我将 z 设置为 transform.position.z,那么对象会保持其 z 位置。但是,它的 x 和 y 坐标与鼠标所在的位置不一致,因此对象始终与鼠标保持一定的距离。
    • 啊,我明白了!这是由于一些简单的数学运算,因为鼠标期望的 z 位置与您的位置不同。
    • 忘记回复了,要解决这个问题,我需要更多背景信息 - 你打算做什么?可以将与角色相同高度的简单平面投射到该平面,然后您可以稍后将角色移动到该平面。这样可以防止您现在遇到的奇怪漂移。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多