欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity實現(xiàn)移動物體到鼠標(biāo)點擊位置

 更新時間:2020年08月18日 09:51:16   作者:XxM_J  
這篇文章主要為大家詳細(xì)介紹了Unity實現(xiàn)移動物體到鼠標(biāo)點擊位置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Unity實現(xiàn)移動物體到鼠標(biāo)點擊位置的具體代碼,供大家參考,具體內(nèi)容如下

目的: 移動物體到鼠標(biāo)點擊處屏幕所對應(yīng)的空間位置,并使物體正對著點擊的對象,不能傾斜。

首先,需要獲取點擊屏幕所對應(yīng)的空間位置,這可以通過先獲取屏幕坐標(biāo),然后轉(zhuǎn)成空間坐標(biāo);也可以通過射線直接獲取到空間位置。

其次 ,移動物體到目的地,可直接通過差值進(jìn)行移動,使物體看向目標(biāo)點,不能直接使用LookAt(),因為,該函數(shù)是使物體的前方面向目標(biāo)點(即物體的forward指向

由物體到目標(biāo)點的向量,這可能使物體在X,Y,Z方向都產(chǎn)生旋轉(zhuǎn),也就產(chǎn)生了傾斜)。當(dāng)目標(biāo)點和物體高度不一致時,比如站著的人 ,讓他走向地面上某一位置,如果使用

LookAt則可能會導(dǎo)致人歪著看向目標(biāo)點,如下圖所示,而通常我們想要的只是人面向物體的方向。

//物體的正方向只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);當(dāng)目標(biāo)點和遠(yuǎn)點不在一個高度時,會使物體發(fā)生傾斜來看想目標(biāo)點
  /// 該方法使物體朝向指向的方向,同時保持物體不傾斜,只繞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;
 
    //將原坐標(biāo)和目的坐標(biāo)映射到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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論