2016-04-26 54 views
1

嘗試使用建議的選項有一個錯誤的Vector3權利並不在其定義 線transform.Rotate(Vector3.Right如何旋轉游戲物體不止一次

預先感謝您

using UnityEngine; 
using System.Collections; 

public class ForwardBack : MonoBehaviour { 
    // speed variable 
    public float speed; 


    public KeyCode pressLeft; 
    public KeyCode pressRight; 
    public float rotationSpeed; 

    // Use this for initialization 
    void Start() { 
     speed = 1f; 
    } 

    // Update is called once per frame 
    void Update() { 

     transform.Translate(0f, speed*Input.GetAxis("Vertical") *  Time.deltaTime,0f); 

     if (Input.GetKey(KeyCode.RightArrow)) 
     { 
      transform.Rotate(Vector3.Right * rotationSpeed * Time.deltaTime); 
     } 
     if (Input.GetKey(KeyCode.LeftArrow)) 
     { 
       transform.Rotate(Vector3.Left * rotationSpeed * Time.deltaTime); 
     } 
    } 
} 
+0

(1)它是'transform.eulerAngles'。但在你的情況(2)你只需要'.Rotate',而不是'.eulerAngles'。 – Fattie

回答

1

您的代碼中存在相當多的低效率。您不應該在Update循環中調用GetComponent<>()。而不是使用Start功能存儲referece它並使用在Update循環:

public class ForwardBack : MonoBehaviour 
{ 

    private Transform thisTransform = null; 

    void Start() 
    { 
     // Get refrence 
     thisTransform = GetComponent<Transform>(); 
    } 

    void Update() 
    { 
     //Use refrence. 
     thisTransform.Rotate(Vector3.right * Time.deltaTime); 
    } 
} 

注意:您可能意識到,MonoBehaviour每一個孩子繼承了transform屬性,它會仰望Transform組件的引用。使用這個效率不高。你應該像我在這裏展示的那樣得到你自己的參考。

編輯:正如@JoeBlow所指出的transform屬性可能可以使用。關於它如何返回Unity文檔中的Transform組件沒有任何提及。我已經讀過,它僅僅是來自幾個不同來源的GetComponent的包裝。自行決定使用。

其次,不要使用eulerAngles旋轉。它甚至在docs中這麼說。

只能使用此變量讀取角度並將其設置爲絕對值。不要增加它們,因爲當角度超過360度時它會失敗。改用Transform.Rotate。

它看起來像你甚至不增加的角度,只需將其設置爲new Vector3(0, 0, -90)反正即使你沒有做到這一點只會被設置爲價值,而不是緩慢增加,這意味着。

eulerAngles該文檔還帶你到你應該使用什麼是Transform.Rotate。要得到這個工作,你將不得不改變輸入法Input.GetKey而非Input.GetKeyDown,但是這已經在其他的人提答案。然後你可以圍繞你想要的軸旋轉。請記住使用Time.deltaTime來縮放該值,以便以相同的速度旋轉,而不管您擁有的幀率如何。您的輪換代碼可能如下所示:

public class ForwardBack : MonoBehaviour 
{ 
    public float roatationSpeed; 
    private Transform thisTransform = null; 

    void Start() 
    { 
     thisTransform = GetComponent<Transform>(); 
    } 

    void Update() 
    { 
     if(Input.GetKey(KeyCode.RightArrow) 
     { 
      thisTransform.Rotate(Vector3.right * rotationSpeed * Time.deltaTime); 
     } 
     if(Input.GetKey(KeyCode.LeftArrow) 
     { 
      thisTransform.Rotate(Vector3.left * rotationSpeed * Time.deltaTime); 
     } 
    } 
} 
+0

謝謝。首先嚐試統一編程。觀看了一些YouTube視頻一定讓自己感到困惑。再次感謝你會嘗試以後 –

+0

@KevinCranfield這是一個很酷的人,每個人都從某個地方開始。儘管很容易找到一些不好的習慣,但要小心YouTube視頻。如果這個問題或其他問題的答案是您正在尋找的答案,那麼請記得接受它! –

+0

使用應用程序找不到接受的答案 –

2

嘗試Input.GetKey代替Input.GetKeyDown

Input.GetKeyDown如果按下一個按鈕檢測,而Input.GetKey檢查連續按。我想這就是爲什麼你的汽缸只開啓CE。