unity3D 使用歐拉角控制視野注意點

變量聲明:ide

1  public PlayerInput p;                  //表示控制代碼用來得到用戶是否按下
2     public float rotateSpeed = 50f;              //旋轉速度
3     private GameObject playerHandle;        //遊戲物體的父節點
4     private GameObject cameraHandle;      //相機節點
5     public float euler=15;                          //X軸的初始旋轉角度
View Code

在學習中,使用歐拉角控制物體視野左右平移沒有什麼可注意的簡單一句就能夠學習

 playerHandle.transform.Rotate(Vector3.up, p.Dright2 * rotateSpeed * Time.deltaTime);

讓主角視野上下移動而且設定一個範圍時,好比旋轉角在【-40,30】之間,則spa

1  cameraHandle.transform.Rotate(Vector3.right, -p.Dup2 * rotateSpeed * Time.deltaTime);
2         cameraHandle.transform.localEulerAngles = new Vector3(Mathf.Clamp(cameraHandle.transform.localEulerAngles.x,-40,30), 0, 0);
View Code

如此作是否是就能夠完成了?code

大錯特錯!orm

只有在【0,30】角度變換時運行效果如你所願,但旋轉角度一旦小於0,結果會出乎意料直接變成30.知道爲何嗎?blog

在unity中旋轉角(我的理解,錯了請指出。)只能是正數。什麼意思呢?遊戲

咱們經過cameraHandle.transform.localEulerAngles.x 得到的X軸旋轉角度只會是正數。那麼負數如何表示呢?在unity中當其值爲負數時,會再加360°,天然轉換爲正數。由於-30°效果和330°同樣。因此當咱們cameraHandle.transform.localEulerAngles.x得到-40時,其實得到到的是320,天然會轉換成30(Mathf.Clamp())。it

 

解決方法:event

很簡單,既然不能直接獲取localEulerAngles.x的負數值,那麼咱們直接自定義一個Float值在每幀進行旋轉角度計算。以下:form

1  euler -= p.Dup2 * rotateSpeed * Time.deltaTime;
2         euler = Mathf.Clamp(euler, -40, 30);
3         cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
View Code

若是簡寫成以下:

1  euler -= p.Dup2 * rotateSpeed * Time.deltaTime;
2         //euler = Mathf.Clamp(euler, -40, 30);
3         //cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
4         cameraHandle.transform.localEulerAngles = new Vector3(Mathf.Clamp(euler, -40, 30), 0, 0);
View Code

雖然看起來簡潔,其實實際運行很差,由於euler的值,在咱們一直按下旋轉鍵時,會一直變化,只是transform.localEulerAngles值只會在【-40,30】,當euler過大,等於100時,當我按下向下視角時只有等到euler的數值變爲小於30,纔會發生變化,反之亦然。用戶體驗太差。

小白自我記錄,有錯之處請多包涵。

相關文章
相關標籤/搜索