Unity實現(xiàn)移動物體到鼠標點擊位置
本文實例為大家分享了Unity實現(xiàn)移動物體到鼠標點擊位置的具體代碼,供大家參考,具體內(nèi)容如下
目的: 移動物體到鼠標點擊處屏幕所對應的空間位置,并使物體正對著點擊的對象,不能傾斜。
首先,需要獲取點擊屏幕所對應的空間位置,這可以通過先獲取屏幕坐標,然后轉(zhuǎn)成空間坐標;也可以通過射線直接獲取到空間位置。
其次 ,移動物體到目的地,可直接通過差值進行移動,使物體看向目標點,不能直接使用LookAt(),因為,該函數(shù)是使物體的前方面向目標點(即物體的forward指向
由物體到目標點的向量,這可能使物體在X,Y,Z方向都產(chǎn)生旋轉(zhuǎn),也就產(chǎn)生了傾斜)。當目標點和物體高度不一致時,比如站著的人 ,讓他走向地面上某一位置,如果使用
LookAt則可能會導致人歪著看向目標點,如下圖所示,而通常我們想要的只是人面向物體的方向。

//物體的正方向只Z的方向,朝向點擊處,夠?qū)⒛P蜁r要調(diào)好
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);當目標點和遠點不在一個高度時,會使物體發(fā)生傾斜來看想目標點
/// 該方法使物體朝向指向的方向,同時保持物體不傾斜,只繞y軸旋轉(zhuǎn)一定角度
/// </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軸方向的旋轉(zhuǎn)的影響
Vector3 t1 = new Vector3(origin.position.x, 0, origin.position.z);
Vector3 t2 = new Vector3(target.x, 0, target.z);
Vector3 forward_dir = t2-t1;
Quaternion rotate = Quaternion.FromToRotation(origin.forward, forward_dir);
float angle = rotate.eulerAngles.y;
origin.rotation *= rotate;//實現(xiàn)旋轉(zhuǎn)。
}
/// <summary>
/// 只繞y軸旋轉(zhuǎn)
/// </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);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#調(diào)用sql2000存儲過程方法小結(jié)
這篇文章主要介紹了C#調(diào)用sql2000存儲過程的方法,以實例形式分別對調(diào)用帶輸入?yún)?shù)及輸出參數(shù)的存儲過程進行了詳細分析,非常具有實用價值,需要的朋友可以參考下2014-10-10
C#Process的OutputDataReceived事件不觸發(fā)問題及解決
這篇文章主要介紹了C#Process的OutputDataReceived事件不觸發(fā)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
C#對多個集合和數(shù)組的操作方法(合并,去重,判斷)
下面小編就為大家?guī)硪黄狢#對多個集合和數(shù)組的操作方法(合并,去重,判斷)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
詳解C# 利用反射根據(jù)類名創(chuàng)建類的實例對象
這篇文章主要介紹了詳解C# 利用反射根據(jù)類名創(chuàng)建類的實例對象,“反射”其實就是利用程序集的元數(shù)據(jù)信息,感興趣的小伙伴們可以參考一下。2017-03-03

