Имеет ли `yield return false;` особое значение в сценариях Unity3d C #?

17

В Unity у нас есть некоторые специальные вещи для сопрограмм, которые являются дополнительными к обычному C #.

например, мы можем использовать

yield return WaitForSeconds(5.f);

чтобы сопрограмма подождала 5 секунд, прежде чем продолжить.

Что делать yield return false;и yield return true;делать?

Almo
источник
хм, я не уверен, что yield return trueделает что-то особенное. Но yield return nullпросто делает паузу для кадра, так что я подозреваю, что это yield return falseимеет точно такой же эффект (также, yield return 0поскольку 0 ложных
нулей
@jhocking «так как 0 ложных нулей все равно под капотом» Почему это имеет значение? C # очень сильно типизированный язык, поэтому в большинстве случаев то, как что-то выглядит «под капотом», не имеет значения. Например, вы не можете просто сделать if (0)или if (null), в отличие от C и C ++.
svick
пожав плечами, это не имеет значения. все, что я знаю, это то, что yield return 0работает; по- видимому , из-за причин MLM объяснил
jhocking
2
Это не является дополнительным к нормальному C #. yieldКлючевое слово было вокруг , так как , по крайней мере C # 2.0. Все, что делает Unity, это вызывает его сопрограмму и обрабатывает сгенерированный итератор и возвращаемые из него значения таким образом, что вы можете вызвать неблокирующие задержки при выполнении вашего кода.
ИЛИ Mapper
1
@Almo: Это просто потому, что WaitForSecondsне объявлено. Как только вы объявляете вызываемый метод, WaitForSecondsкоторый принимает аргумент float и возвращает тип элемента перечисления, которое вы реализуете, он снова компилируется. Следовательно, yieldне является особенным для Unity. Во всяком случае, этот WaitForSecondsметод является особенным для Unity, но даже тогда он не расширяет язык C #, а просто является дополнительным методом, который был написан с использованием стандартного C #.
ИЛИ Mapper

Ответы:

19

Единственные возможные значения доходности, которые понимает планировщик:

  • Классы , производные от YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequestи сопрограммы
  • WWWобъект
  • «любое другое значение», которое не является одним из вышеперечисленных.

Если получено «любое другое значение» (которое включает «нулевое» строковое значение любого другого базового типа, такого как int, bool , ... или ссылку на произвольный объект, который не является одним из вышеупомянутых), планировщик будет «график» сопрограммы для следующего кадра .

- Bunny83 answer: Выдающийся участник Unity ответы

Эти WaitForEndOfFrameи другие подобные, просто пустые функции, которые помечают YieldInstruction, чтобы решить, что делать в движке.

Случай по умолчанию кажется WaitForEndOfFrame. Так что если выyield return что-то, что не имеет особого значения, например, bool, это то же самое, что и WaitForEndOfFrame.

Похоже, нет официальной документации по этому поведению.


Обновить

Раттер прокомментировал еще один особый случай:yield return null

Все сопрограммы Unity, в том числе yield return null, запускаются до визуализации фрейма, за исключением WaitForEndOfFrame. Вы можете найти Раттер «s удивительный ответ над на Unity Ответы объясняя это дополнительные (хорошие диаграммы включены).

MLM
источник
6
Принято считать, что урожайность nullи WaitForEndOfFrameодинаковы, но на самом деле они немного отличаются , как подробно описано на странице руководства по порядку выполнения .
Руттер