我是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
值是必要的。为什么会有所不同?有谁可以给我一个解释?
谢谢!
答案 0 :(得分:1)
拖动GameObject时,需要将其移动到OnMouseDrag中的delta。通过delta,我指的是前一帧和当前帧之间的位置之间的差异。
但是在拖动开始之前当前位置是未知的,这就是为什么应该在开始拖动之前设置偏移,即在OnMouseDown中。
如果你没有在OnMouseDown中设置偏移量,那么会发生两件事:
0,0,-10
且GameObject位于0,0,0
,在这种情况下Camera.main.ScreenToWorldPoint(Input.mousePosition)
将始终在Z轴返回-10 您现在可以将Z值从10更改为0.这是因为在每个帧中都应用了偏移量。