`Yield return false;` ha un significato speciale negli script Unity3d C #?


17

In Unity, abbiamo alcune cose speciali per le coroutine che si aggiungono al normale C #.

per esempio, possiamo usare

yield return WaitForSeconds(5.f);

per far attendere una coroutine 5 secondi prima di continuare.

Cosa fare yield return false;e yield return true;fare?


hm non sono sicuro se yield return truefa qualcosa di speciale. Ma yield return nullsemplicemente fa una pausa per un fotogramma, quindi sospetto che yield return falseabbia esattamente lo stesso effetto (anche yield return 0perché 0 false null sono tutti uguali sotto il cofano)
jhocking

@jhocking "poiché 0 false null sono tutti uguali sotto il cofano" Perché è importante? C # è un linguaggio fortemente tipizzato, quindi la maggior parte delle volte non importa come appare qualcosa "sotto il cofano". Ad esempio, non puoi semplicemente fare if (0)o if (null), a differenza di C e C ++.
svick

scrollare le spalle quindi non importa. tutto quello che so è che yield return 0funziona; apparentemente a causa del motivo spiegato da MLM
jhocking del

2
Questo non è aggiuntivo al normale C #. La yieldparola chiave esiste da almeno C # 2.0. Unity non fa altro che chiamarlo coroutine e gestisce l'iteratore generato e i valori restituiti da esso in modo da poter causare ritardi non bloccanti nell'esecuzione del codice.
OR Mapper

1
@Almo: è semplicemente perché WaitForSecondsnon è stato dichiarato. Non appena si dichiara un metodo chiamato WaitForSecondsche accetta un argomento float e che restituisce il tipo di elemento dell'enumerazione che si sta implementando, verrà nuovamente compilato. Quindi, yieldnon è speciale per l'Unità. Semmai, il WaitForSecondsmetodo è speciale per Unity, ma anche in questo caso, non estende il linguaggio C #, ma è semplicemente un metodo aggiuntivo che è stato scritto usando C # standard.
OR Mapper,

Risposte:


19

Gli unici valori di rendimento possibili che lo scheduler comprende sono:

  • Classi derivate da YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequeste coroutine
  • un WWWoggetto
  • "qualsiasi altro valore" che non sia uno dei precedenti.

Se viene restituito "qualsiasi altro valore" (che include "null" un valore stringa qualsiasi altro tipo di base come int, bool , ... o un riferimento a un oggetto arbitrario che non è uno dei suddetti) lo scheduler "programma" la routine per il fotogramma successivo .

- Risposta Bunny83: membro di spicco di Unity Answers

Il WaitForEndOfFramee altri simili, sono solo funzioni vuote che taggano il YieldInstructionper decidere cosa fare nel motore.

Il caso predefinito sembra essere WaitForEndOfFrame. Quindi se hai yield returnqualcosa che non ha un significato speciale, come un bool, è lo stesso di WaitForEndOfFrame.

Non sembra esserci alcuna documentazione ufficiale su questo comportamento.


Aggiornare

Rutter ha commentato un altro caso speciale:yield return null

Tutte le Coroutine Unity yield return null, incluso , vengono eseguite prima del rendering del frame, ad eccezione di WaitForEndOfFrame. Puoi trovare la fantastica risposta di Rutter su Unity Answers che spiega ulteriormente questo (simpatici diagrammi inclusi).


6
È comune presumere che i rendimenti nulle WaitForEndOfFramesiano gli stessi, ma in realtà sono leggermente diversi , come dettagliato nella pagina del manuale dell'ordine di esecuzione .
Rutter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.