Unity實現移動物體到滑鼠點選位置
阿新 • • 發佈:2020-08-18
本文例項為大家分享了Unity實現移動物體到滑鼠點選位置的具體程式碼,供大家參考,具體內容如下
目的:移動物體到滑鼠點選處螢幕所對應的空間位置,並使物體正對著點選的物件,不能傾斜。
首先,需要獲取點選螢幕所對應的空間位置,這可以通過先獲取螢幕座標,然後轉成空間座標;也可以通過射線直接獲取到空間位置。
其次 ,移動物體到目的地,可直接通過差值進行移動,使物體看向目標點,不能直接使用LookAt(),因為,該函式是使物體的前方面向目標點(即物體的forward指向
由物體到目標點的向量,這可能使物體在X,Y,Z方向都產生旋轉,也就產生了傾斜)。當目標點和物體高度不一致時,比如站著的人 ,讓他走向地面上某一位置,如果使用
LookAt則可能會導致人歪著看向目標點,如下圖所示,而通常我們想要的只是人面向物體的方向。
//物體的正方向只Z的方向,朝向點選處,夠將模型時要調好 using UnityEngine; using System.Collections; public class Move : MonoBehaviour { private Vector3 targetPos; // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if(Physics.Raycast(ray,out hit,1000.0f)){ targetPos = hit.point; } turnForward2(transform,targetPos); } //transform.LookAt(targetPos); transform.position = Vector3.Lerp(transform.position,targetPos,Time.deltaTime); } /// <summary> /// 直接用transform.LookAt(targetPos);當目標點和遠點不在一個高度時,會使物體發生傾斜來看想目標點 /// 該方法使物體朝向指向的方向,同時保持物體不傾斜,只繞y軸旋轉一定角度 /// </summary> /// <param name="origin"></param> /// <param name="target"></param> void turnForward(Transform origin,Vector3 target) { //Vector3 forward_dir = target - origin.position; //Quaternion rotate = Quaternion.FromToRotation(origin.forward,forward_dir); //float angle = rotate.eulerAngles.y; //origin.rotation *= rotate; //將原座標和目的座標對映到XOZ平面,從而過濾掉y軸方向的旋轉的影響 Vector3 t1 = new Vector3(origin.position.x,origin.position.z); Vector3 t2 = new Vector3(target.x,target.z); Vector3 forward_dir = t2-t1; Quaternion rotate = Quaternion.FromToRotation(origin.forward,forward_dir); float angle = rotate.eulerAngles.y; origin.rotation *= rotate;//實現旋轉。 } /// <summary> /// 只繞y軸旋轉 /// </summary> /// <param name="origin"></param> /// <param name="target"></param> void turnForward2(Transform origin,Vector3 target) { Vector3 forward_dir = target - origin.position; Quaternion rotate = Quaternion.FromToRotation(origin.forward,forward_dir); float angle = rotate.eulerAngles.y; // origin.rotation *= rotate; // origin.Rotate(0f,angle,0f); origin.Rotate(Vector3.up,angle); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。