Unity中实现iOS侧滑手势交互与触摸移动控制

【鼠标点击实现移动】

第一步,在要移动的GameObject的Inspector面板中添加角色控制器组件并调整参数。

unity响应ios侧滑手势 unity触摸移动_方向向量

参数的调整可以依照Scene面板,如下图的绿色线框(角色控制器组件是一种胶囊形状的特殊刚体,这里我把Height调整为了0所以是球体的样子):

unity响应ios侧滑手势 unity触摸移动_归零_02

第二步,在 要移动的GameObject 的 脚本 中先声明下面的变量:

登录后复制

1 private CharacterController m_CharacterController;    //角色控制器组件的引用
2 private Vector3 targetPosition = Vector3.zero;        //用于存放要到达位置的坐标,归零表示暂时不需要移动
3 private RaycastHit hitInfo;                    //存放碰撞检测信息(点击射线与地面的碰撞的信息)

第三步,在脚本的Update方法里实现鼠标点击获取目的地坐标(当然把下述代码封装在一个方法里,再在Update方法中调用也可以):

登录后复制

1         if (Input.GetMouseButtonUp(1))//参数0是左键,1是右键
 2         {   //生成由一道 由主Camera至屏幕点击处 的射线
 3             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 4             //检测射线与地面是否碰撞并额外返回碰撞信息至hitInfo变量,第三个参数确定射线长度,第四个参数确定开启检测的layer(在本例子里地面处于defaul层,即第0层)
 5             if (Physics.Raycast(ray, out hitInfo,Mathf.Infinity,1<<0))
 6             {//讲hitInfo中关于碰撞点的位置存贮至targetPosition变量中
 7                     targetPosition = hitInfo.point;
 8             }         9         }    
10         //空格键停止移动         
11         if (Input.GetKeyUp(KeyCode.Space)) {targetPosition = Vector3.zero;}

最后一步,在脚本的Update方法中实现物体的移动(下述代码也可以封装在一个方法里,然后在Update方法中调用也可以,但注意,在调用这段代码前,targetPosition要先获取的目的地坐标):

登录后复制

1 //坐标归零则不需要移动
 2         if (targetPosition == Vector3.zero) { return; }
 3         //先检测物体与坐标与目的坐标,大于0.1f则继续朝向移动,注意:这里不能判断条件不可以写>0,因为实际运行时两的点的距离通常不会为零,而是零点几
 4         if (Vector3.Distance(transform.position, targetPosition) > 0.1f){
 5             Vector3 direction = targetPosition - transform.position;                                    //获得方向向量
 6             direction = direction.normalized;                                                           //方向向量归一化  
 7             transform.LookAt(new Vector3(targetPosition.x,transform.position.y, targetPosition.z));     //物体Z轴指向目的地坐标
 8             m_CharacterController.Move(direction *Time.deltaTime* 1);                                   //调用组件移动方法,方向向量作为参数传入
 9         }
10         else
11         {   //到达目的地则targetPosition归零
12             targetPosition = Vector3.zero;
13         }

Last but not least,再强调一下比较重要的三个地方。

1、第二段代码第5行:

登录后复制

if (Physics.Raycast(ray, out hitInfo,Mathf.Infinity,1<<0))
方法的第二个参数添加额外返回值,第四个参数开启指定图层的碰撞检测。

2、第三段代码第4行的判断条件: 

登录后复制

Vector3.Distance(transform.position, targetPosition) > 0.1f
这里判断条件不要写>0,因为实际运行时,两点距离为一个小数,写>0的话,物体到达目的地后不会停下,而是围着目的地转。

3、第三段代码第6行:

登录后复制

direction = direction.normalized;
 方向向量的归一化。
 

   

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空