【Unity3D】简单常用的功能实现1——鼠标点击实现移动

【鼠标点击实现移动】

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

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

 

 第二步,在 要移动的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;
 方向向量的归一化。 
posted @ 2020-07-01 16:22  469の一方爬行  阅读(733)  评论(0编辑  收藏  举报