2015-09-22 55 views
0

我有一個類正在改變播放器的速度。下面是代碼:WaitForSeconds不工作

using UnityEngine; 
using System.Collections; 

public class MultiplySpeed : MonoBehaviour { 
    public int multiplier = 2; 
    public Controls player; 
    bool flag = false; 
    void OnTriggerExit(Collider c){ 
     if(c.tag == "Player"){ 
      player = c.gameObject.GetComponent<Controls>(); 
      if(!flag){ 
       multiplySpeed(); 
       StartCoroutine(powerUp()); 
      } 
      flag = true; 
     } 
    } 
    public IEnumerator powerUp(){ 
     yield return new WaitForSeconds(10); 
     backToNormal(); 
     StopCoroutine(powerUp()); 
    } 
    public void multiplySpeed(){ 
     player.speed = player.speed * multiplier; 
    } 
    public void backToNormal(){ 
     player.speed = player.speed/ multiplier; 
    } 
} 

我有兩個問題,第一個是啓動協程和標誌變量設置爲true後,該方法OnTriggerExit再次調用,並且標誌是假的,一切再次執行。第二個問題是方法backToNormal看起來好像從未執行過,它只是將速度放大並且不會恢復正常。任何幫助表示讚賞。

編輯: 試圖通過拉塞克盧弗建議的方法後,這裏是我的代碼:

using UnityEngine; 
using System.Collections; 

public class MultiplySpeed : MonoBehaviour { 
    public int multiplier = 2; 
    public Controls player; 
    bool flag = false; 
    float timer = 5.0f; 
    void update(){ 
     timer -= Time.deltaTime; 
     if (timer == 0) { 
      backToNormal(); 
      timer = -1f; 
     } 

    } 
    void OnTriggerExit(Collider c){ 
     if(c.tag == "Player"){ 
      player = c.gameObject.GetComponent<Controls>(); 
      if(!flag){ 
       timer = 5.0f; 
       flag = true; 
       multiplySpeed(); 
      } 
     } 
    } 
    public void multiplySpeed(){ 
     player.speed = player.speed * multiplier; 
    } 
    public void backToNormal(){ 
     player.speed = player.speed/ multiplier; 
    } 
} 

不過,我有完全一樣的問題。

+0

您不需要'StopCoroutine'調用:協程運行一次,當它們返回時結束。我不確定在一個新的協同程序中調用'StopCoroutine'是做什麼的。 (請參閱http://docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html(http://docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html)。) – 31eee384

+0

您能否提供更詳細的描述腳本背後的邏輯?國旗的目的是什麼? –

回答

0

嘗試使用這個腳本:如果你想改變玩家對速度的時間(5秒),如果它擊中一個功率達我會去周圍的其他方式一定量

using UnityEngine; 
using System.Collections; 

using UnityEngine; 
using System.Collections; 

public class MultiplySpeed : MonoBehaviour 
{ 
    public int multiplier = 2; 
    public Controls player; 
    bool flag = false; 
    float timer = 5.0f; 
    bool countDown = false; 

    void update() 
    { 
     if (countDown) 
     { 
      timer -= Time.deltaTime; 
      if (timer <= 0) 
      { 
       backToNormal(); 
       countDown = false; 
      } 
     } 

    } 
    void OnTriggerExit(Collider c) 
    { 
     if (c.tag == "Player") 
     { 
      player = c.gameObject.GetComponent<Controls>(); 
      if (!flag) 
      { 
       countDown = true; 
       timer = 5.0f; 
       flag = true; 
       multiplySpeed(); 
      } 
     } 
    } 
    public void multiplySpeed() 
    { 
     player.speed = player.speed * multiplier; 
    } 
    public void backToNormal() 
    { 
     player.speed = player.speed/multiplier; 
    } 
} 
+0

我不想統計幀數,我想計算秒數。 –

+0

我給我的答案添加了一個例子。在這種情況下,計數器變量在3秒後將變爲0。 – lassedev

+0

我有和以前完全一樣的問題,我用新代碼更新了問題。 –

0

。我不會在加電時進行計時 - 因爲我認爲它應該在玩家擊中後立即銷燬 - 我會從附加到玩家的腳本中完成。 類似下面應該工作:

using UnityEngine; 

public class SpeedBoostPowerUp : MonoBehaviour 
{ 
    private void OnTriggerEnter(Collider c) 
    { 
     if(c.tag == "Player") 
     { 
      Destroy(gameObject); 
     } 
    } 
} 

然後,你可以添加你的移動組件(Controls.cs)內的速度提升的代碼。你可以做這樣的事情(我不想改變太多你的代碼):

// INSIDE CONTROLS COMPONENT 
private void OnTriggerEnter(Collider c) 
{ 
    if(c.tag == "SpeedBoostPowerUp") 
    { 
     if (!flag) 
     { 
      StartCorouting(BoostSpeed); 
     } 
    } 
} 

public void MultiplySpeed() 
{ 
    this.speed = this.speed * this.multiplier; 
} 

public void BackToNormal() 
{ 
    this.speed = this.speed/this.multiplier; 
} 

private IEnumerator BoostSpeed() 
{ 
    flag = true; 
    MultiplySpeed(); 
    yield return new WaitForSeconds(5); 
    BackToNormal(); 
    flag = false; 
} 

當然,你需要用「SpeedBoostPowerUp」標籤來標記您的開機遊戲對象。該標誌被使用,所以你不能一次有多個速度提升。 這應該工作得很好,如果你使用「靜態」電源ups - 所以電源ups有固定的行爲。如果你想給玩家一個隨機提升等,如果它打開電源 - 例如在馬里奧卡丁車 - 我會結構不同。但是這對於我想要實現的目標來說太複雜了。

注意:我不會回到正常速度速度=速度/乘數而是使用一個變量來存儲速度,然後再乘以它,因爲它應該不太容易出錯。像這樣:

private float speedBeforeBoost; 

public void MultiplySpeed() 
{ 
    this.speedBeforeBoost = this.speed; 
    this.speed *= this.multiplier; 
} 

public void BackToNormal() 
{ 
    this.speed = this.speedBeforeBoost; 
}