ваш метод playRound
будет продолжать работать, пока сопрограмма WaitSecsCoroutine
уступает. Это связано с тем, что управление возвращается вызывающему методу, как только достигается оператор yield return
.
Происходит следующее:
playRound
вызывается - ваши GameObjects создаются
waitSecs
вызывается waitSecs
вызовы сопрограммы waitSecsCoroutine
waitSecsCoroutine
достигает yield return new WaitForSeconds()
- Управление теперь возвращается обратно к
waitSecs
, которое, в свою очередь, возвращается к PlayRound
playRound
продолжается с coverObject.gameObject.SetActive(true);
и последующим кодом, пока waitSecsCoroutine
все еще ждет.
Что вам нужно сделать, так это сделать playRound
сопрограмму и использовать yield return WaitSecsCoroutine
, чтобы функция остановила свое выполнение до тех пор, пока WaitSecsCoroutine
не завершится:
IEnumerator playRound()
{
coverObject.gameObject.SetActive(true);
for (int i = 0; i < keys - 1; i++)
{
GameObject instantiated = Instantiate(key);
}
yield return WaitSecsCoroutine(3);//This now waits until WaitSecsCoroutine is finished
coverObject.gameObject.SetActive(true);
GameObject instantiatedCorrect = Instantiate(key);
correctKey = instantiatedCorrect;
yield return WaitSecsCoroutine(2);
coverObject.gameObject.SetActive(false);
}
Однако обратите внимание, что вы также можете просто вызвать WaitForSeconds
непосредственно из вашего playRoudn
метода, если это сопрограмма, без необходимости отдельной функции
IEnumerator playRound()
{
coverObject.gameObject.SetActive(true);
for (int i = 0; i < keys - 1; i++)
{
GameObject instantiated = Instantiate(key);
}
yield return new WaitForSeconds(3);
coverObject.gameObject.SetActive(true);
GameObject instantiatedCorrect = Instantiate(key);
correctKey = instantiatedCorrect;
yield return new WaitForSeconds(2);
coverObject.gameObject.SetActive(false);
}
В качестве альтернативы вы можете переместить код, который хотите выполнить, после ожидания в ваш метод WaitSecsCoroutine
.