在我初学Unity的时候在利用鼠标控制物体移动的时候搞了很长一段时间,对于新手来说,屏幕坐标系转换确实有一点的麻烦,在此写下我的第一篇博客,也算证明自己进军IT界的决心。
首先我们需要思考的是如何使一个物体产生移动,这里我改变它的坐标来达到目的,这里我们先声明一个vector3 Point = vector3.zero;作为物体当前的值
这样可以使第一帧不移动,实现同步的效果
当然我们第一部就是获取到鼠标的点击事件
if (Input.GetMouseButton(0))
{
然后我们将鼠标在屏幕中的坐标转换乘世界坐标
这里我们需要用一个Vector3来接收
vector3 nowPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
现在我们获得了鼠标的坐标并且已经转换成了世界坐标
如果Point发生了改变就要改变飞机的坐标Point
if(Point != Vector3.zero)
当鼠标坐标发生改变时,鼠标上一帧坐标和当前坐标产生向量
vector3 offest = nowPoint - Point;
这时我们就可以改变物体的坐标了:比如物体是cube,我们将这个向量加给物体的坐标,这样物体移动的距离和方向就会和鼠标一致了
Point = nowPoint;其实这是我们应该做的第一句话,但是我们现在还没有获得当前坐标所以需要写在之后
}
这时你会发现已经可以做到鼠标控制移动了,但是会有一个问题,那就是因为现在是默认记住当前的,当你松开手鼠标时再次点击时和之前的坐标跨度巨大,会时物体瞬移 所以我们需要在 这里写上鼠标脱离屏幕之后将Point设置为o,这样第一帧不会进入发生向量的判定条件(Point!=vector3.zero)内,当第二帧才会运行,就避免了因为鼠标脱离之后再次点击就会脱离的情况了。这样的方法也可以实现控制旋转等等情况。
第一次写,表达可能会很差,总之就是希望一些初学者有这方面问题希望能起到帮助,谢谢阅读!