2016-12-15 29 views
2

我有一個球員,我使用下面的腳本旋轉。它旋轉播放器20度,而不是10(我需要10)。不明白爲什麼。當我按q時,它只執行一次。腳本旋轉對象比我需要的更多

enter image description here

enter image description here

private UnityStandardAssets.Characters.FirstPerson.FirstPersonController firstPersonController; 
public GameObject player; 

void Start() 
{ 
    firstPersonController = player.GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>(); 
} 

void Update() 
{ 
    StartCoroutine("RotatePlayerDelay");   
} 

IEnumerator RotatePlayerDelay() 
{ 
    Debug.Log("1"); 
    firstPersonController.m_MouseLook.myAngle += 10; // here I have +20, not +10 
    yield return new WaitForSeconds(0.005f); 
    firstPersonController.m_MouseLook.myAngle = 0; 
    Debug.Log("2"); 
} 

附:我需要協同程序,因爲沒有它,它將永遠旋轉

+1

這有點難以給出答案而不知道FirstPersonController類和MouseLook類。我也很確定你不需要一個協程,而是像「isAiming」或「isFacingTarget」這樣的布爾值。順便說一句:協程是開始每幀看起來不可取的。 – Wipster

回答

3

FixedUpdate不同,它每Time.fixedDeltaTime秒被調用一次,因此Update方法沒有確切的時間步。它是一個依賴於遊戲的FPS和所有渲染器和行爲的持續時間並因此動態改變的協同程序。

你能想到的Update爲:

void Start() 
{ 
    StartCoroutine(_update);   
} 
IEnumerator _update() 
{ 
    while(true) 
    { 
     Update(); 
     yield return null;    
    } 
} 

當你開始在Update方法的協同程序,你不能告訴前一幀是否已經結束。如果您的FPS低於1/0.005 = 200.0 FPS,那麼協程的不同調用肯定會相互重疊。

0.005這裏指的是產生回報新WaitForSeconds(0.005f)


嘗試在另一個協程啓動協程:

void Start() 
{ 
    StartCoroutine("RotatePlayerDelay");   
} 

IEnumerator RotatePlayerDelay() 
{ 
    while(true) 
    { 
     Debug.Log("1"); 
     firstPersonController.m_MouseLook.myAngle += 10; // here I have +20, not +10 
     yield return new WaitForSeconds(0.005f); 
     firstPersonController.m_MouseLook.myAngle = 0; 
     Debug.Log("2"); 
     yield return new WaitForSeconds(0.005f); 
    } 
}