Sono confuso e curioso su come funziona coroutines (in Unity3D e forse in altri posti). Coroutine è una nuova discussione? di unità documentation hanno detto:Coroutine è una nuova discussione in Unity3D?
Un coroutine è una funzione che può sospendere l'esecuzione (resa) finché termina la proposta YieldInstruction.
E hanno C# esempi here:
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Start() {
print("Starting " + Time.time);
StartCoroutine(WaitAndPrint(2.0F));
print("Before WaitAndPrint Finishes " + Time.time);
}
IEnumerator WaitAndPrint(float waitTime) {
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
}
Ho molte domande su questo esempio:
Nell'esempio di cui sopra, che la linea è coroutine?
WaitAndPrint()
è una coroutine?WaitForSeconds()
è una coroutine?In questa riga:
yield return new WaitForSeconds(waitTime);
, perché sono presenti siayield
siareturn
? Ho letto in Unity documentation che "La dichiarazione di rendimento è un tipo speciale di rendimento, che garantisce che la funzione continui dalla riga dopo la dichiarazione di rendimento la prossima volta che viene chiamata." Seyield
è uno specialereturn
, che cosa fareturn
qui?Perché dobbiamo restituire un
IEnumerator
?StartCoroutine
avvia una nuova discussione?Quante volte è stato chiamato
WaitAndPrint()
nell'esempio precedente?yield return new WaitForSeconds(waitTime);
è stato effettivamente restituito? Se sì, suppongo cheWaitAndPrint()
sia stato chiamato due volte nel codice precedente. E immagino cheStartCoroutine()
chiami più volteWaitAndPrint()
. Tuttavia, ho visto another Unity documentation che dice: "L'esecuzione di una coroutine può essere messa in pausa in qualsiasi momento usando la dichiarazione di rendimento.Il valore di ritorno di rendimento specifica quando viene ripresa la coroutine." Queste parole mi fanno pensare che loWaitAndPrint()
in realtà non sia tornato; è stato semplicemente messo in pausa; Stava aspettando ilWaitForSeconds()
per tornare. Se questo è il caso, allora il codice di cui sopraWaitAndPrint()
è stato chiamato solo una volta eStartCoroutine
era solo responsabile dell'avvio della funzione, non la chiama più volte.
In risposta alla domanda nel titolo, le coroutine ** NON ** avviano un nuovo thread e di per sé non hanno alcuna connessione ai thread. Non dimenticare che Unity3D è fondamentalmente basato su frame. I MonoBehaviours sono un concetto basato su frame. Le coroutine - in Unity - sono intrinsecamente connesse a questo paradigma. I thread sono totalmente non coinvolti. – Fattie
Mi imbatto in questo tutorial http://www.unitygeek.com/coroutines-in-unity3d/, spiega molto bene l'uso delle coroutine in unity3d –