`Yield return false;` tem um significado especial nos scripts Unity3d C #?

17

No Unity, temos algumas coisas especiais para corotinas adicionais ao C # normal.

por exemplo, podemos usar

yield return WaitForSeconds(5.f);

para que uma corotina aguarde 5 segundos antes de continuar.

O que fazer yield return false;e yield return true;fazer?

Almo
fonte
hm, não tenho certeza se yield return truefaz algo especial. Mas yield return nullsimplesmente faz uma pausa para um quadro, então eu suspeito que yield return falsetem exatamente o mesmo efeito (também yield return 0desde 0 false nulo são todos iguais sob o capô)
jhocking
@jhocking “como 0 falso nulo são todos iguais” Por que isso importa? O C # é muito uma linguagem fortemente tipada; portanto, na maioria das vezes, como algo parece "oculto" não importa. Por exemplo, você não pode simplesmente fazer if (0)ou if (null), ao contrário de C e C ++.
svick
encolher os ombros, então não importa. tudo o que sei é que yield return 0funciona; aparentemente por causa da razão MLM explicou
jhocking
2
Isso não é adicional ao C # normal. A yieldpalavra - chave existe desde pelo menos C # 2.0. Tudo o que o Unity faz é chamá-lo de rotina e manipula o iterador gerado e os valores retornados a partir de uma maneira que você pode causar atrasos sem bloqueio na execução do seu código.
OR Mapper
1
@ Almo: Isso é simplesmente porque WaitForSecondsnão é declarado. Assim que você declarar um método chamado WaitForSecondsque recebe um argumento de flutuação e retorna o tipo de elemento da enumeração que está implementando, ele será compilado novamente. Portanto, yieldnão é especial para a Unidade. De qualquer forma, o WaitForSecondsmétodo é especial para o Unity, mas, mesmo assim, não estende a linguagem C #, mas é simplesmente um método extra que foi escrito usando o C # padrão.
OU Mapper

Respostas:

19

Os únicos valores de rendimento possíveis que o planejador entende são:

  • Classes de derivados de YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequeste co-rotina
  • um WWWobjeto
  • "qualquer outro valor" que não seja um dos anteriores.

Se "qualquer outro valor" for gerado (que inclui "nulo", um valor de cadeia de caracteres, qualquer outro tipo básico, como int, bool , ... ou uma referência a um objeto arbitrário que não seja um dos mencionados acima), o planejador irá "agende" a rotina para o próximo quadro .

- Resposta do Bunny83: Membro proeminente no Unity Answers

Os WaitForEndOfFramee outros semelhantes, são apenas funções em branco que marcam os YieldInstructionitens para decidir o que fazer no mecanismo.

O caso padrão parece ser WaitForEndOfFrame. Então, se você tem yield returnalgo que não tem um significado especial, como um bool, é o mesmo que WaitForEndOfFrame.

Parece não haver nenhuma documentação oficial sobre esse comportamento.


Atualizar

rutter comentou sobre outro caso especial:yield return null

Todas as Unity Coroutines yield return null, incluindo , são executadas antes do quadro renderizar, exceto WaitForEndOfFrame. Você pode encontrar a resposta impressionante de rutter nas respostas do Unity, explicando isso mais adiante (belos diagramas incluídos).

MLM
fonte
6
É comum supor que ceder nulle WaitForEndOfFramesão os mesmos, mas eles são realmente um pouco diferente , conforme detalhado na ordem de execução página manual.
rutter