案例名称:unity实现鼠标拖拽物体移动
原理解释:
unity场景世界坐标(world space)和屏幕坐标(Screen space)的互相转化。其中鼠标坐标(Input.mousePosition获取)属于屏幕坐标。当鼠标点击场景中的游戏对象(this.gameobject)并拖拽的的时候,
内部实现是经过了这两个坐标系转化的:
步骤2,鼠标拖拽游戏对象的时候,屏幕坐标转化为世界坐标,由ScreenToWorldPoint实现,这个转化后的坐标就是物体在世界坐标系中的新位置
注意:世界坐标和屏幕坐标的转化,z轴是不变的,变化的只是x,y轴
IEnumerator OnMouseDown()
{
if (m_camera)
{
//步骤1:游戏对象m_gameObject世界坐标系到屏幕坐标系的转换。其中m_camera = Camera.main.camera
Vector3 screenPositon = m_camera.WorldToScreenPoint(m_gameOject.transform.position);
#region print语句部分,测试变换后的坐标轴变化
//变换前的游戏对像世界坐标系坐标
print ("world.x"+m_gameOject.transform.position.x);
print("world.y"+m_gameOject.transform.position.y);
print("world.z"+m_gameOject.transform.position.z);
//变化后的屏幕坐标系坐标
print ("locol.x"+screenPositon.x);
print ("locol.y"+screenPositon.y);
print ("locol.z"+screenPositon.z);
//上面两段print测试代码打印出的值可以看出变换后的坐标只有x,y值变换了,z轴没变
print ("Input.mousePosition.x"+Input.mousePosition.x);
print ("Input.mousePosition.y"+Input.mousePosition.y);
//步骤2:屏幕坐标系转化为世界坐标,这个坐标通过ScreenToWorldPoint转换就是物体移动后的世界坐标距离
//Input.mousePosition获取鼠标点击坐标,鼠标坐标属于屏幕坐标
Vector3 mScreenPosition = new Vector3(Input.mousePosition.x,Input.mousePosition.y,screenPositon.z);
//前面两个步骤主要是运算这个偏移量的,通过下面的print测试代码,可知道由世界坐标转后的屏幕坐标和inputmousePosition获取的坐标是有概2 个像素的偏移量的
print ("locol.x"+screenPositon.x);
print ("locol.y"+screenPositon.y);
print ("Input.mousePosition.x"+Input.mousePosition.x);
print ("Input.mousePosition.y"+Input.mousePosition.y);
Vector3 offest = m_gameOject.transform.position - m_camera.ScreenToWorldPoint(mScreenPosition);
print("drag starting :"+ transform.name);
//若鼠标一直按,则循环继续步骤1和步骤2,进行坐标系转化
while(Input.GetMouseButton(0))
{
mScreenPosition = new Vector3(Input.mousePosition.x,Input.mousePosition.y,screenPositon.z);
//对象新坐标
m_gameOject.transform.position = offest + m_camera.ScreenToWorldPoint(mScreenPosition);
//协同,等待下一帧继续
yield return new WaitForFixedUpdate();
}
}
}
}