變量聲明:

1 public PlayerInput p; //表示控制代碼用來獲得用戶是否按下 2 public float rotateSpeed = 50f; //旋轉速度 3 private GameObject playerHandle; //游戲物體的父節點 4 private GameObject cameraHandle; //相機節點 5 public float euler=15; //X軸的初始旋轉角度
在學習中,使用歐拉角控制物體視野左右平移沒有什么可注意的簡單一句就可以
playerHandle.transform.Rotate(Vector3.up, p.Dright2 * rotateSpeed * Time.deltaTime);
讓主角視野上下移動並且設定一個范圍時,比如旋轉角在【-40,30】之間,則

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);
如此做是不是就可以完成了?
大錯特錯!
只有在【0,30】角度變換時運行效果如你所願,但旋轉角度一旦小於0,結果會出乎意料直接變成30.知道為什么嗎?
在unity中旋轉角(個人理解,錯了請指出。)只能是正數。什么意思呢?
我們通過cameraHandle.transform.localEulerAngles.x 獲得的X軸旋轉角度只會是正數。那么負數如何表示呢?在unity中當其值為負數時,會再加360°,自然轉換為正數。因為-30°效果和330°一樣。所以當我們cameraHandle.transform.localEulerAngles.x獲得-40時,其實獲得到的是320,自然會轉換成30(Mathf.Clamp())。
解決方法:
很簡單,既然不能直接獲取localEulerAngles.x的負數值,那么我們直接自定義一個Float值在每幀進行旋轉角度計算。如下:

1 euler -= p.Dup2 * rotateSpeed * Time.deltaTime; 2 euler = Mathf.Clamp(euler, -40, 30); 3 cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
如果簡寫成如下:

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);
雖然看起來簡潔,其實實際運行不好,因為euler的值,在我們一直按下旋轉鍵時,會一直變化,只是transform.localEulerAngles值只會在【-40,30】,當euler過大,等於100時,當我按下向下視角時只有等到euler的數值變為小於30,才會發生變化,反之亦然。用戶體驗太差。
小白自我記錄,有錯之處請多包涵。