2016-03-07 4 views
0

В Unity C# я использую сопрограмму для отображения простого шаблона на экране через х секунд, используя строку «yield return new WaitForSeconds (1.5f)», но после ее первого вызова она изменяет isPlayerTurn с false на true.Почему сопрограмма изменяет значение переменной?

 void Update() { 
     if (!isPlayerTurn) { 
      pattern.Add (Random.Range (1, 5)); 
      Debug.Log (isPlayerTurn); 
      StartCoroutine(ShowPattern()); 
      isPlayerTurn = true; 

     } 

     pointGUI.GetComponent<UnityEngine.UI.Text>().text = "Points: " + playerPoints; 
    } 

    private IEnumerator ShowPattern() { 
     Debug.Log (isPlayerTurn); 
     yield return new WaitForSeconds (1.5f); 
     Debug.Log (isPlayerTurn); 

     // etc 
    } 

Выход из бревен являются

False 
False 
True 

Есть ли причина такого поведения, или это логическая ошибка?

+0

* Это * не меняет 'isPlayerTurn', * вы * изменение' isPlayerTurn'. Код, который его изменяет, находится прямо в вашем вопросе. Можете ли вы пояснить, какое поведение вы ожидали и почему? – hvd

+0

@hvd Значение 'isPlayerTurn' должно оставаться' False' после этого урока, потому что оно необходимо с помощью функции 'ShowPattern()' и должно быть 'True' только после того, как' ShowPattern() 'завершает выполнение (на // и т. Д. часть). –

+0

Я не спрашиваю, почему вы хотите, чтобы он был «ложным», я спрашиваю, почему вы думаете, что текущий код сохранит его «false». – hvd

ответ

2

Как писал hvd, вы устанавливаете isPlayerTurn в true. Когда вы начинаете метод текущей строки coroutine, он не останавливается, но он выполняет следующий оператор в паралеле до метода в сопрограмме.

Здесь вы Архиваторов увидеть пример того, как сопрограммная работает в единстве: The Unity3D StartCoroutine calls a function, when does that function return?

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