實現思路:鼠標點擊,產生目標點,計算角色和目標點的夾角,旋轉角色朝向目標點,然后移動角色。
看到很多人瀏覽了這篇博文 ,有人建議寫點注釋,我就簡單注釋一下。
注意事項:寫完了才發現原來沒必要這么麻煩,這樣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函數 好多都可以省了