2017-01-18 4 views
2

私は現在IEnumerator & CoroutineをUnityのコンテキスト内で理解しようとしていますが、 "yield returns null"が実行する内容についてはあまり自信がありません。現時点では、基本的には一時停止して次のフレームを待っていて、次のフレームでは再びwhileステートメントを実行するように戻ってきます。Unity - IEnumeratorのyieldがnullを返す

「yield return null」を省略した場合、オブジェクトはその宛先に即座に移動したり、「多くのフレームをスキップする」ようです。だから私は私の質問は、この "ループの中でこの戻り値ヌル"関数とどのように必要なのですか?

void Start() { 
    StartCoroutine(Move()); 
} 

IEnumerator Move(){ 

    while (a > 0.5f){ 

     ... (moves object up/down) 

     yield return null; // <--------- 
    } 

    yield return new WaitForSeconds(0.5f); 

    .... (moves object up/down) 

    StartCoroutine(Move()); 
} 
+1

私はCoroutines自身に精通していませんが、フレームごとに1回(または何か)実行され、「yield return」は基本的に「次の更新を続行するまで待つ」というショートカットです。もしあなたがそれを持っていなければ、whileループは単一の更新で完全に完了するまで実行されます。なぜなら、オブジェクトはそれがなくても即座に動くからです。 – Abion47

答えて

5

プログラムはループを開始します。収量がなければ、同じフレーム内のすべての繰り返しを実行するだけです。 数百万回の反復があった場合は、すべての反復が完了してから続行するまで、プログラムをブロックする可能性が最も高いでしょう。

コルーチンを作成するとき、UnityはMonoBehaviourオブジェクトにそれを添付します。歩留まりに達するまでStartCoroutineの呼び出しで最初に実行されます。その後、コルーチンから戻り、歩留まりに基づいてスタックに配置されます。 nullの場合、次のフレームで再び実行されます。特定の瞬間にアクションを実行する必要がある場合、いくつかのコルーチンはWaitForEndOfFrameを呼び出すことがあります。場合によっては、後者の場合と同様にタイマーを開始することがあります。

その時点で、コルーチンはオフであり、プログラムは残りの部分を実行することができます。次のフレームで、Unityはスタックされたコルーチンを見つけ、中断した場所からコールします。 ループが本当の条件に達しない場合は、基本的に更新メソッドを作成しました。

コルーチンの目的は、プログラムをブロックせずに一定期間にわたって実行するアクションを実行することです。

重要:これはマルチスレッドではありません。

3

あなたは正しいです。 yield return nullは次のフレームまで待ってから実行を続行します。あなたのケースでは、whileループの状態を次のフレームにチェックします。

オブジェクトが入力ごとにフレームごとに動くようにするため、「なぜこれが必要か」はおそらくあります。 yield return nullがなければ、1つのフレームでwhileループを実行するだけです。

さらに重要:あなたはフレームごとにUpdateになり、染みを調整したいようです。そのために簡単にUpdate()を使うことができます。この関数は、アクティブスクリプトのすべてのフレームでUnityによって呼び出されます。

関連する問題