1. 程式人生 > 程式設計 >Unity實現移動物體到滑鼠點選位置

Unity實現移動物體到滑鼠點選位置

本文例項為大家分享了Unity實現移動物體到滑鼠點選位置的具體程式碼,供大家參考,具體內容如下

目的:移動物體到滑鼠點選處螢幕所對應的空間位置,並使物體正對著點選的物件,不能傾斜。

首先,需要獲取點選螢幕所對應的空間位置,這可以通過先獲取螢幕座標,然後轉成空間座標;也可以通過射線直接獲取到空間位置。

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

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

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

Unity實現移動物體到滑鼠點選位置

//物體的正方向只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);
 
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。