刚开始在将鼠标点转换为世界坐标时,我以为可以直接使用Unity的Camera.main.ScreenToWorldPoint( Input.mousePosition ) 就完事了,事实证明我想的太简单了。在我们使用这个API将鼠标屏幕点(Screen)转换成世界坐标(World)的时候,因为鼠标点z值的原因,直接使用的话得到的永远是一个固定值(Camera.main 的世界坐标),所以我们需要将鼠标点进行一个修正。
处理的方法:
1.我们将需要跟随鼠标移动物体的世界坐标转换为屏幕坐标(World→Screen)。
//将目标物体的世界坐标转换成屏幕坐标
Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(target.transform.position);
2.然后将转换后的 z值传给鼠标坐标,修正鼠标坐标。
//修正后的鼠标坐标
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreenPos.z);
3.现在就可以把修正后的mousePos转换为世界坐标了
//将修正后的鼠标位置 转换为世界坐标
Vector3 mouseSToW = Camera.main.ScreenToWorldPoint(mousePos);
完整代码:
//鼠标按下时 鼠标点的位置Vector3 mouseStartMovePos;//鼠标按下时 target的位置Vector3 targetStartMovePos;private void FollowMove(){//将 target世界坐标转换成屏幕坐标Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(target.transform.position);//修正鼠标点的坐标Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreenPos.z);//将 修正后的鼠标点 转换成世界坐标Vector3 mouseSToW = Camera.main.ScreenToWorldPoint(mousePos);//鼠标按下时记录 鼠标点的位置 和 target的位置if (Input.GetMouseButtonDown(0)){mouseStartMovePos = mouseSToW ;targetStartMovePos = target.transform.position;}//跟随移动,加上偏移if (Input.GetMouseButton(0)){target.transform.position = targetStartMovePos + mouseSToW - mouseStartMovePos;}}















