Перечислитель, сгенерированный для вас компилятором, повторяется.Once.
Компилятор сгенерирует класс, реализующий IEnumerator, который имеет функцию MoveNext () и свойство Current.В классе будут все члены, необходимые для хранения состояния функции между вызовами.Точные детали можно считать «Волшебством компилятора».
Объект этого сгенерированного класса будет обрабатываться и управляться движком Unity3d.Механизм Unity3d будет вызывать MoveNext () для каждой активной сопрограммы один раз за каждый кадр (если не указано иное).
Это позволило программисту Unity3d писать сценарии, которые воспроизводятся по одному кадру за раз.Комбинация магии компилятора C # и магии Unity3d Engine приводит к очень мощным, но простым в использовании сценариям.
Чтобы ответить на ваш вопрос: код в вашей функции будет выполнен один раз, но он будет приостановленв операторе yield return.
Как указано выше, компилятор C # создает специальный объект, реализующий IEnumerator.
При первом вызове MoveNext () ваша функция создаетвзрыв и устанавливает текущий объект в «новый WaitForSeconds (1.5f)».
Механизм Unity3d проверяет этот объект, видит, что он является экземпляром специального класса «WaitForSeconds», поэтому помещает перечислитель в некоторую очередь ожидания,и не будет запрашивать второй элемент, пока не пройдет 1,5 с.Тем временем будет воспроизведено много кадров, и будет воспроизведен взрыв.
Через 1,5 секунды Unity захватит перечислитель из очереди и снова вызовет MoveNext ().Вторая часть вашей функции будет выполнена сейчас, но не сможет сгенерировать второй объект.MoveNext () вернет false, чтобы указать, что ему не удалось получить новый элемент, что является сигналом для Unity3d, чтобы выбросить этот перечислитель.Сборщик мусора вернет память в какой-то момент времени.
Как уже говорилось: происходит много магии компиляторов и Unity3d.Если вы помните, что ваша функция будет удерживаться до следующего кадра в каждом операторе yield return, вы будете знать достаточно, чтобы воспользоваться этими специальными функциями.