Czy jest nowy wątek w Unity3D?
Jestem zdezorientowany i ciekawy, jakcoroutines (w Unity3D i być może w innych miejscach) działa. Czy jest nowy wątek? Jednośćdokumentacja oni powiedzieli:
Korekta to funkcja, która może zawiesić swoje wykonanie (wydajność) aż do zakończenia danej YieldInstruction.
I mają przykłady C #tutaj:
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);
}
}
Mam wiele pytań na temat tego przykładu:
W powyższym przykładzie, która linia jest wierszem? JestWaitAndPrint()
koronka? JestWaitForSeconds()
koronka?
W tej linii:yield return new WaitForSeconds(waitTime);
, dlaczego obayield
ireturn
są obecni? CzytałemDokumentacja jedności że „Deklaracja rentowności jest szczególnym rodzajem zwrotu, który zapewnia, że funkcja będzie kontynuowana z linii po deklaracji rentowności przy następnym wywołaniu”. Jeśliyield
jest wyjątkowyreturn
, co jestreturn
robisz tutaj?
Dlaczego musimy zwrócićIEnumerator
?
RobiStartCoroutine
rozpocząć nowy wątek?
Ile razy maWaitAndPrint()
został wywołany w powyższym przykładzie? Zrobiłyield return new WaitForSeconds(waitTime);
naprawdę wrócił? Jeśli tak, to myślęWaitAndPrint()
został wywołany dwukrotnie w powyższym kodzie. I myślęStartCoroutine()
dzwoniłWaitAndPrint()
wiele razy. Widziałem jednakkolejna dokumentacja Unity to mówi: „Wykonanie coroutine może być wstrzymane w dowolnym momencie za pomocą instrukcji yield. Wartość zwrotu wydajności określa, kiedy wznowienie jest wykonywane.” Te słowa sprawiają, że czuję toWaitAndPrint()
faktycznie nie wrócił; był tylko wstrzymany; czekał naWaitForSeconds()
wracać. Jeśli tak jest, to w powyższym kodzieWaitAndPrint()
został wywołany tylko raz iStartCoroutine
był odpowiedzialny za uruchomienie funkcji, nie wywołując jej wiele razy.