【原】unity3d 鼠标点击 控制人物行走

实现思路:鼠标点击,产生目标点,计算角色和目标点的夹角,旋转角色朝向目标点,然后移动角色。

看到很多人浏览了这篇博文 ,有人建议写点注释,我就简单注释一下。
 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函数 好多都可以省了

posted @ 2012-07-11 22:43  U_探索  阅读(4271)  评论(0编辑  收藏  举报