2016-03-02 82 views
0

我想用一個協程來讓玩家在拍攝新子彈之前等一會兒,但它永遠不會超過收益率。代碼如下Unity C#收益率返回新WaitForSeconds正在停止協程

protected override void Start() { 
    base.Start(); 
    animator = GetComponent<Animator>(); 
    score = GameManager.instance.playerScore; 
    playerLives = GameManager.instance.playerLife; 
} 
void Update(){ 
    int horizontal = (int)Input.GetAxisRaw("Horizontal"); 
    AttemptMove (horizontal, 0); 
    if (Input.GetKeyDown ("space")) { 
     if(canShoot){ 
     Vector3 shootPosition = transform.position + new Vector3 (0, 0.5f, 0); 
     Instantiate (bullet, shootPosition, Quaternion.identity); 
     StartCoroutine(Shoot()); 
     } 
    } 
} 

IEnumerator Shoot(){ 
    Debug.Log("Start"); 
    canShoot=false; 
    yield return new WaitForSeconds (shootingTimeDelay); 
    canShoot=true; 
    Debug.Log("End"); 
} 

shootingTimeDelay設置爲1.1f。我並沒有在任何地方銷燬我的gameObject,並且它可以在我的項目中的其他腳本中正常工作。

它從不打印結束。我沒有得到什麼錯

+0

'Time.timeScale'大於'0'? –

+0

它等於1 –

+1

這是c#上帝告訴你不使用協程 – MickyD

回答

2

我會說不要使用協程來這樣的事情。

試圖這樣做的,看看你得到更好的restults

private float time = 0; 

public float fireTime = 1.1f; 

private void Update() 
{ 
    time += Time.deltaTime; 

    if(Input.GetKeyDown("space") && time >= fireTime) 
    { 
    Vector3 shootPosition = transform.position + new Vector3 (0, 0.5f, 0); 
    Instantiate (bullet, shootPosition, Quaternion.identity); 
    time = 0; 
    } 
} 
+0

這是更好的解決方案,然後使用協程,但我們仍然應該在OP代碼中找到問題。 –

+0

該解決方案的工作原理非常完美。我在接受它之前等待,因爲我想知道我的代碼中的問題 –

+1

代碼中必須有一個外部因素。我用你的協同程序做了一個測試,它工作得很好。我會看看腳本執行順序或任何其他可能遠程涉及的類 –

0

好吧,我發現的bug。我在它的超類中有一個名爲StopAllCoroutine的方法,但由於某種原因,我從來沒有嘗試過它。更改爲StopCoroutine(「我的協同程序的名稱」),現在它完美:)