【原】unity3d 鼠标点击 控制人物行走
实现思路:鼠标点击,产生目标点,计算角色和目标点的夹角,旋转角色朝向目标点,然后移动角色。
看到很多人浏览了这篇博文 ,有人建议写点注释,我就简单注释一下。
注意事项:写完了才发现原来没必要这么麻烦,这样transform.forward=(mousePos-transform.position).normalized 就可以直接让角色朝向目标点 RayControl函数 好多都可以省了
看到很多人浏览了这篇博文 ,有人建议写点注释,我就简单注释一下。
1 void Update () 2 { 3 if(Input.GetMouseButtonDown(0)) 4 { 5 RayControl(); 6 } 7 if(flagMove) 8 { 9 if(Vector3.Distance(transform.position,mousePos)>1) 10 { 11 transform.Translate(transform.worldToLocalMatrix* transform.forward * Time.deltaTime*5);//transform.forward是世界坐标,通过transform.worldToLocalMatrix转换矩阵转到本地坐标然后在本地坐标运动,没有必要必须在本地坐标系运动 但是必须注意要统一起来。 12 } 13 else 14 { 15 flagMove=false; 16 } 17 } 18 } 19 void RayControl() 20 { 21 Ray ray=Camera.main.ScreenPointToRay (Input.mousePosition);//向屏幕发射一条射线 22 if(Physics.Raycast(ray,out hit,200))射线长度为200 和地面的碰撞盒做检测 23 { 24 GameObject targetPos=GameObject.CreatePrimitive(PrimitiveType.Sphere);//实例化一个Sphere 25 targetPos.transform.localScale=new Vector3(0.5f,0.5f,0.5f); 26 mousePos=hit.point;//获取碰撞点坐标 27 mousePos.y=transform.position.y; 28 targetPos.transform.position=mousePos;//Sphere放到鼠标点击的地方 29 targetDir=mousePos-transform.position;//计算出朝向 30 Vector3 tempDir=Vector3.Cross(transform.forward,targetDir.normalized);//用叉乘判断两个向量是否同方向 31 float dotValue=Vector3.Dot(transform.forward,targetDir.normalized);//点乘计算两个向量的夹角,及角色和目标点的夹角 32 float angle=Mathf.Acos(dotValue)*Mathf.Rad2Deg; 33 if(tempDir.y<0)//这块 说明两个向量方向相反,这个判断用来确定假如两个之间夹角30度 到底是顺时 还是逆时针旋转。 34 { 35 angle=angle*(-1); 36 } 37 print(tempDir.y); 38 print("2:"+angle); 39 transform.RotateAround(transform.position,Vector3.up,angle); 40 flagMove=true; 41 } 42 }
注意事项:写完了才发现原来没必要这么麻烦,这样transform.forward=(mousePos-transform.position).normalized 就可以直接让角色朝向目标点 RayControl函数 好多都可以省了