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


  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值