unity鼠标拖拽物体移动


案例名称:unity实现鼠标拖拽物体移动

原理解释:

unity场景世界坐标(world space)和屏幕坐标(Screen space)的互相转化。其中鼠标坐标(Input.mousePosition获取)属于屏幕坐标。当鼠标点击场景中的游戏对象(this.gameobject)并拖拽的的时候,

内部实现是经过了这两个坐标系转化的:


步骤1,首先场景中游戏对象的世界坐标转化为屏幕坐标,由WorldToScreenPoint实现。

步骤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();
			}
}
}
}


你可能感兴趣的:(unity3d学习总结)