【鼠标点击实现移动】
第一步,在要移动的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;
方向向量的归一化。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删