为什么在Unity中进行2D拖动的代码不起作用?

时间:2016-10-08 09:46:19

标签: unity3d unity5

我是Unity的新手,今天我试图实现鼠标拖动。我写了以下代码:

void OnMouseDrag()
{
    Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10);
    Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint);
    transform.position = curPosition;
}

但是,拖动GameObject后它会从相机中消失,但我可以看到它从场景视图中的原始位置移开。

我在互联网上搜索,发现正确的版本是这样的:

void OnMouseDown()
{
    offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10));
}

void OnMouseDrag()
{
    Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10);
    Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
    transform.position = curPosition;
}

我无法弄清楚为什么offset值是必要的。为什么会有所不同?有谁可以给​​我一个解释?

谢谢!

1 个答案:

答案 0 :(得分:1)

拖动GameObject时,需要将其移动到OnMouseDrag中的delta。通过delta,我指的是前一帧和当前帧之间的位置之间的差异。

但是在拖动开始之前当前位置是未知的,这就是为什么应该在开始拖动之前设置偏移,即在OnMouseDown中。

如果你没有在OnMouseDown中设置偏移量,那么会发生两件事:

  1. GameObject移动靠近相机(在Z轴上),您需要手动修改其Z(这是您遇到的奇怪行为背后的原因)。 这是因为Z轴上的相机位置始终与其渲染的可见对象不同。假设相机位于0,0,-10且GameObject位于0,0,0,在这种情况下Camera.main.ScreenToWorldPoint(Input.mousePosition)将始终在Z轴返回-10
  2. GameObject的中心始终是鼠标,而不是您开始拖动的位置。
  3. 注意:

    您现在可以将Z值从10更改为0.这是因为在每个帧中都应用了偏移量。