亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Unity3D實現(xiàn)相機跟隨控制

 更新時間:2020年07月06日 08:47:55   作者:c羅天下第一  
這篇文章主要為大家詳細介紹了Unity3D實現(xiàn)相機跟隨控制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Unity3D實現(xiàn)相機跟隨控制的具體代碼,供大家參考,具體內容如下

跟隨算法

要實現(xiàn)3D攝像機的控制第一步就是先實現(xiàn)攝像機跟隨物體移動。
要想讓相機跟隨物體移動,就要明白在一定角度下相機與物體的位置關系。

首先設置相機與物體之間的距離distance,相機與xz平面的角度為roll
所以根據(jù)三角關系可以求得映射在xz平面的距離d為distancecos(rool),相機高度為distancesin(roll)。
如下圖

現(xiàn)在就可以確定相機的高度了即y軸的坐標相機的y軸坐標應該為 Camera.Main.y=物體.y+height

在xz平面中,設相機與物體的距離為d(就是上面說的那個d,distance映射在xz平面的長度),相機的旋轉角度為rot。根據(jù)下圖可以看到,相機與物體的連線與x軸的角度為rot-180.根據(jù)三角函數(shù),既可以得出x軸的位移為d*sin(rot) ,z軸的位移為d*cos(rot) 。

所以說開始的時候指定distance和rot和roll就可以實現(xiàn)跟隨了。實現(xiàn)跟隨的代碼如下

public class CameraFollow : MonoBehaviour
{
 //距離
 public float distance = 15;
 //橫向角度
 public float rot = 0;
 //縱向角度 30d度
 public float roll = 30f * Mathf.PI * 2 / 360;
 //目標物體
 public GameObject target;
 
 private void Start()
 {
 target = GameObject.Find("Black Track");
 }
 
 private void LateUpdate()
 {
 if (target == null)
  return;
 if (Camera.main == null)
  return;
  
 //目標的坐標
 Vector3 targetPos = target.transform.position;
 //用三角函數(shù)計算相機的位置
 Vector3 cameraPos;
 float d = distance * Mathf.Cos(roll);
 float height = distance * Mathf.Sin(roll);
 cameraPos.x = targetPos.x + d * Mathf.Cos(rot);
 cameraPos.z = targetPos.z + d * Mathf.Sin(rot);
 cameraPos.y = targetPos.y + height;
 Camera.main.transform.position = cameraPos;
 Camera.main.transform.LookAt(target.transform);
 }
}

在跟隨的時候我們可以在要跟隨的物體下放置一個子物體命名為cameraPoint使相機對準這個子物體從而方便的更改攝像機的視角。
所以在物體下添加一個cameraPoint的子物體

并且添加代碼

//設置目標
 public void SetTarget(GameObject target)
 {
 if (target.transform.Find("cameraPoint") != null)
  this.target = target.transform.Find("cameraPoint").gameObject;
 else
  this.target = target;
 }

如果準的物體有名為cameraPoint的子物體,那么相機對準cameraPoint子物體。

橫向與縱向旋轉攝像機

當鼠標向左移動時,相機隨之左轉,當鼠標向右移動時,相機隨之右轉。
Unity的輸入軸Mouse X 和 Mouse Y 代表著鼠標的移動增量,也就是說當鼠標向左移動時,Input.GetAxis(“Mouse X”)的值會增大,向右則減少。只要讓旋轉角度rot與Mouse X成正比關系,便能通過鼠標控制攝像機的角度。
代碼如下

//橫向旋轉速度
public float rotSpeed=0.1f;
//橫向旋轉
public void Rotate()
 {
 float w = Input.GetAxis("Mouse X") * rotSpeed;
 rot -= w;
 }

同理對于縱向旋轉我們需要設定一個范圍 所以代碼如下

//縱向旋轉角度
public float maxRoll = 70f * Mathf.PI * 2 / 360;
public float minRoll = 0f * Mathf.PI * 2 / 360;
//縱向旋轉速度
private float rollSpeed = 0.1f;
//縱向旋轉
public void Roll()
 {
 float w = Input.GetAxis("Mouse Y") * rollSpeed;
 roll -= w;
 if (roll > maxRoll)
  roll = maxRoll;
 if (roll < minRoll)
  roll = minRoll;
 }

滾輪調節(jié)距離

通過鼠標滾輪調整相機與物體之間的距離
代碼如下

//距離范圍
public float maxDistance = 22f;
public float minDistance = 5f;
//距離變化速度
public float zoomSpeed = 0.2f;
//調整距離
public void Zoom()
 {
 if(Input.GetAxis("Mouse ScrollWheel") >0)
 {
  if (distance > minDistance)
  distance -= zoomSpeed;
 }
 else if (Input.GetAxis("Mouse ScrollWheel") < 0)
 {
  if (distance < maxDistance)
  distance += zoomSpeed;
 }
 }

全部代碼

public class CameraFollow : MonoBehaviour
{
 //距離
 public float distance = 15;
 //橫向角度
 public float rot = 0;
 //縱向角度 30d度
 public float roll = 30f * Mathf.PI * 2 / 360;
 
 //目標物體
 public GameObject target;
 
 //橫向旋轉速度
 public float rotSpeed=0.1f;
 
 //縱向旋轉角度
 public float maxRoll = 70f * Mathf.PI * 2 / 360;
 public float minRoll = 0f * Mathf.PI * 2 / 360;
 //縱向旋轉速度
 private float rollSpeed = 0.1f;
 
 //距離范圍
 public float maxDistance = 22f;
 public float minDistance = 5f;
 //距離變化速度
 public float zoomSpeed = 0.2f;
 
 private void Start()
 {
 target = GameObject.Find("Black Track");
 SetTarget(target);
 }
 
 private void LateUpdate()
 {
 if (target == null)
  return;
 if (Camera.main == null)
  return;
 //橫向旋轉
 Rotate();
 //縱向旋轉
 Roll();
 //縮放
 Zoom();
 //目標的坐標
 Vector3 targetPos = target.transform.position;
 //用三角函數(shù)計算相機的位置
 Vector3 cameraPos;
 float d = distance * Mathf.Cos(roll);
 float height = distance * Mathf.Sin(roll);
 cameraPos.x = targetPos.x + d * Mathf.Cos(rot);
 cameraPos.z = targetPos.z + d * Mathf.Sin(rot);
 cameraPos.y = targetPos.y + height;
 Camera.main.transform.position = cameraPos;
 Camera.main.transform.LookAt(target.transform);
 }
 
 //設置目標
 public void SetTarget(GameObject target)
 {
 if (target.transform.Find("cameraPoint") != null)
  this.target = target.transform.Find("cameraPoint").gameObject;
 else
  this.target = target;
 }
 
 //橫向旋轉
 public void Rotate()
 {
 float w = Input.GetAxis("Mouse X") * rotSpeed;
 rot -= w;
 }
 
 //縱向旋轉
 public void Roll()
 {
 float w = Input.GetAxis("Mouse Y") * rollSpeed;
 roll -= w;
 if (roll > maxRoll)
  roll = maxRoll;
 if (roll < minRoll)
  roll = minRoll;
 }
 
 //調整距離
 public void Zoom()
 {
 if(Input.GetAxis("Mouse ScrollWheel") >0)
 {
  if (distance > minDistance)
  distance -= zoomSpeed;
 }
 else if (Input.GetAxis("Mouse ScrollWheel") < 0)
 {
  if (distance < maxDistance)
  distance += zoomSpeed;
 }
 }
}

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

相關文章

  • C# 數(shù)組刪除元素的實現(xiàn)示例

    C# 數(shù)組刪除元素的實現(xiàn)示例

    本文主要介紹了C# 數(shù)組刪除元素的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C#實現(xiàn)DVD借出歸還管理系統(tǒng)

    C#實現(xiàn)DVD借出歸還管理系統(tǒng)

    這篇文章主要介紹了C#實現(xiàn)DVD借出歸還管理系統(tǒng),類似DVD管理器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C#多線程數(shù)組模擬socket

    C#多線程數(shù)組模擬socket

    這篇文章主要為大家詳細介紹了C#多線程數(shù)組模擬socket的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#應用XML作為數(shù)據(jù)庫的快速開發(fā)框架實現(xiàn)方法

    C#應用XML作為數(shù)據(jù)庫的快速開發(fā)框架實現(xiàn)方法

    這篇文章主要介紹了C#應用XML作為數(shù)據(jù)庫的快速開發(fā)框架實現(xiàn)方法,詳細介紹了將XML作為數(shù)據(jù)庫的C#桌面應用開發(fā)技巧,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • C#.Net ArrayList的使用方法

    C#.Net ArrayList的使用方法

    這篇文章主要介紹了C#.Net ArrayList的使用方法,使用動態(tài)數(shù)組的優(yōu)點是可以根據(jù)用戶需要,有效利用存儲空間,需要的朋友可以參考下
    2015-10-10
  • unity實現(xiàn)弧形移動 可角度自定

    unity實現(xiàn)弧形移動 可角度自定

    這篇文章主要為大家詳細介紹了unity實現(xiàn)弧形移動,可角度自定,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 使用JsonConverter處理上傳文件的路徑問題

    使用JsonConverter處理上傳文件的路徑問題

    我們上傳一個文件,把文件保存到服務器上,會有一個明確的物理路徑,由于需要從前端訪問這個文件,還需要web服務器中的一個虛擬路徑,我們可以使用JsonConverter 來自動處理一下,這篇文章主要介紹了使用JsonConverter處理上傳文件的路徑,需要的朋友可以參考下
    2022-12-12
  • 用Linq從一個集合選取幾列得到一個新的集合(可改列名)

    用Linq從一個集合選取幾列得到一個新的集合(可改列名)

    這篇文章主要介紹了用Linq從一個集合選取幾列得到一個新的集合(可改列名),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 算法證明每一位都相同十進制數(shù)不是完全平方數(shù)

    算法證明每一位都相同十進制數(shù)不是完全平方數(shù)

    這篇文章主要為大家介紹了算法證明每一位都相同十進制數(shù)不是完全平方數(shù)的過程論述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • C#身份證驗證小例子

    C#身份證驗證小例子

    C#身份證驗證小例子,需要的朋友可以參考一下
    2013-04-04

最新評論