Esta é a palavra-chave C # yield em ação - não está fazendo nada de especial com o wwwobjeto, mas significa algo especial para o método em que está contido. Especificamente, essa palavra-chave pode ser usada apenas em um método que retorna um IEnumerable(ou IEnumerator) e é usado para indicar qual objeto será "retornado" pelo enumerador quando MoveNext for chamado.
Funciona porque o compilador converte o método inteiro em uma classe separada que implementa IEnumerable(ou IEnumerator) usando uma máquina de estado - o resultado líquido é que o corpo do método em si não é executado até que alguém enumere por meio do valor de retorno. Isso funcionará com qualquer tipo, não há absolutamente nada de especial WWW, é o método que o contém, que é especial.
Dê uma olhada nos bastidores da palavra-chave C # yield para obter mais informações sobre que tipo de código o compilador C # gera, ou apenas experimente e inspecione você mesmo usando algo como IL Spy
Atualização: para esclarecer
- Quando o Unity chama uma corotina que contém uma
yield returndeclaração, tudo o que acontece é que um enumerador é retornado - nenhum corpo do método é executado neste momento
- Para que o corpo do método execute o Unity, é necessário chamar
MoveNexto iterador para obter o primeiro valor na sequência. Isso faz com que o método execute até a primeira yeild returninstrução, momento em que o chamador é reiniciado (e presumivelmente o Unity continua a renderizar o restante do quadro)
- Pelo que entendi, o Unity normalmente passa a chamar o
MoveNextmétodo no iterador uma vez a cada quadro subseqüente, fazendo com que o método seja executado novamente até a próxima yield returninstrução uma vez a cada quadro, até que seja yield breakatingido o final do método ou de uma instrução (indicando final da sequência)
O bit somente especial aqui (e em um par de outros casos ) é que a unidade não avança este iterador determinado o próximo quadro, em vez ela só avança o iterador (fazendo com que o método para continuar a execução) quando o download for concluído. Embora pareça haver uma classe YieldInstruction básica que, presumivelmente, contém um mecanismo genérico para sinalizar para o Unity quando um iterador deve ser avançado, a WWWclasse não parece herdar dessa classe, portanto, posso apenas assumir que há um caso especial para essa classe no mecanismo do Unity.
Só para esclarecer: a yieldpalavra - chave não faz nada de especial para a WWWclasse, é o tratamento especial que o Unity oferece aos membros da enumeração retornada que causa esse comportamento.
Atualize o segundo: quanto ao mecanismo WWWusado para baixar páginas da Web de forma assíncrona, provavelmente ele usa o método HttpWebRequest.BeginGetResponse, que usará internamente a IO assíncrona ou, alternativamente, poderia usar threads (criando um thread dedicado ou usando um pool de threads).
yield returnpara operações assíncronas é um hack. Em um programa C # "real", você usaria umTaskpara isso. O Unity provavelmente não os está usando porque foi criado antes do .Net 4.0, quandoTaskfoi introduzido.