coroutines(Unity3Dなどの場合)がどのように機能するのか混乱して不思議です。コルーチンは新しいスレッドですか?ユニティのdocumentationは、彼らは言った:coroutineはUnity3Dの新しいスレッドですか?
コルーチンが与えられたYieldInstructionが終了するまでその実行(歩留まり)を一時停止することができる機能です。
そして、彼らは、C#の例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); } }
私は、この例について多くの質問がありますか?
WaitAndPrint()
はコルーチンですか?WaitForSeconds()
はコルーチンですか?この行には
yield return new WaitForSeconds(waitTime);
という理由で、yield
とreturn
の両方が存在するのはなぜですか?私はUnity documentationで "yieldステートメントは次回の呼び出し時にyieldステートメントの後の行から関数が確実に継続することを保証する特別なリターンです"と読みました。yield
が特別なreturn
の場合、ここでreturn
は何をしていますか?なぜ
IEnumerator
を返さなければならないのですか?StartCoroutine
は新しいスレッドを開始しますか?上記の例で何回
WaitAndPrint()
が呼び出されましたか?yield return new WaitForSeconds(waitTime);
は本当に返されましたか?はいの場合は、上記のコードでWaitAndPrint()
が2回呼び出されたと思います。そして、私はStartCoroutine()
がWaitAndPrint()
を何度も呼び出していたと思います。しかし、私はanother Unity documentationを見ました: "コルーチンの実行は、いつでもyield文を使って中断できます。yield returnの値はコルーチンがいつ再開されるかを指定します。"これらの言葉は、私には、WaitAndPrint()
が実際に返されていないと感じさせます。単に一時停止しただけだった。WaitForSeconds()
が戻るのを待っていました。この場合、上記のコードではWaitAndPrint()
が一度だけ呼び出され、StartCoroutine
は関数の起動に責任があり、複数回は呼び出されませんでした。
タイトルの質問に答えて、コルーチン**は新しいスレッドを開始しません。スレッド自体には接続しません。 Unity3Dは基本的にフレームベースであることを忘れないでください。MonoBehavioursはフレームベースのコンセプトです。 Coroutines - Unityでは - 本質的にこのパラダイムに関連しています。スレッドはまったく関心がありません。 – Fattie
私はこのチュートリアルhttp://www.unitygeek.com/coroutines-in-unity3d/にぶつかって、unity3dでコルーチンの使用について非常によく説明しています –