2016-03-02 11 views
0

Я хотел использовать сопрограмму, чтобы заставить игрока подождать немного, прежде чем стрелять в новую пулю, но она никогда не пройдет мимо урожая. Вот кодUnity C# yield return new WaitForSeconds останавливает coroutine

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"); 
} 

стрельбаTimeDelay установлена ​​в 1.1f. Я не уничтожаю свой gameObject где угодно, и он работает правильно в других сценариях моего проекта.

Он никогда не печатает Конец. Я не понимаю, что не так

+0

'Time.timeScale' больше, чем' 0'? –

+0

Это равно 1 –

+1

Это боги C#, которые вам говорят _not_ для использования сопрограмм – 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

Ok я нашел ошибку. У меня был метод в своем суперклассе, который назывался StopAllCoroutines, но по какой-то причине я никогда не был до этого до сих пор. Изменено это на StopCoroutine («имя моей сопрограммы»), и теперь он отлично работает :)

Смежные вопросы