web-dev-qa-db-ja.com

Unity-IEnumeratorのyield return null

私は現在、Unityのコンテキスト内でIEnumeratorとCoroutineを理解しようとしていますが、「yield return null」が何を実行するかについて自信がありません。現時点では、基本的に一時停止して次のフレームを待機し、次のフレームではwhileステートメントを再度実行することに戻ります。

「yield return null」を省略した場合、オブジェクトは即座に目的地に移動するか、「多くのフレームをスキップする」ようです。私の質問は、このwhileループ内でこの「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());
}
7
WonderfulWonder

プログラムはループを開始します。収量がなかった場合、同じフレーム内ですべての反復を実行します。数百万の反復がある場合、すべての反復が完了するまでプログラムをブロックする可能性が高く、その後続行します。

コルーチンを作成すると、UnityはそれをMonoBehaviourオブジェクトにアタッチします。歩留まりに達するまで、StartCoroutineの呼び出しで最初に実行されます。その後、コルーチンから戻り、歩留まりに基づいてスタックに配置します。 nullを生成すると、次のフレームで再び実行されます。コルーチンから返すことができるYieldInstructionにはさまざまなものがあります。それらについて詳しくはこちらをご覧ください ここおよび関連リンクを介して

コルーチンが生成されると、メインスレッドは実行を続けます。次のフレームで、Unityはスタックされたコルーチンを見つけ、それらが歩留まりで中断したところから呼び出します。コルーチンが範囲外にならない場合は、基本的に更新メソッドを作成しました。

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

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

21
Everts

あなたは正しいです。 _yield return null_は、次のフレームまで待機してから実行を継続します。あなたの場合は、whileの状態をチェックして次のフレームをループします。

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

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

4
Max Auer