いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

Unityでコルーチンを使ってみる(2)

 前回の続きです。コルーチンの使い方をまとめます。

(使用例4)5秒経ったら何かする

StartCoroutine(wait5());
……

IEnumerator wait5()
{
    Debug.Log("●●●");
    yield return new WaitForSeconds(5f);  //(A)
    Debug.Log("●●●5秒経ったよ");
}

StartCoroutine(wait5())
でコルーチンを実行します。wait5()では(A)のところで5秒間、実行が止まります。その後次の行が実行されます。

(使用例5)フラグを監視し、trueになったら何かする

StartCoroutine(checkFlag());
……

IEnumerator checkFlag()
{
    while (!flag)
    {
        yield return new WaitForEndOfFrame();  //(B)
    }
    Debug.Log("●●●フラグが立ったよ");
}

checkFlag()を見てください。flagがfalseである間、(B)が実行されますが、
yield return new WaitForEndOfFrame(); //(B)
は「次のフレームに再開する」という意味です。つまり、(B)の行で実行はいったん止まり、その下の行が実行されるのは次のフレームだということです。「その下の行」は、ここでは「}」(whileループの最後)ですから、結局次のフレームでwhileループの先頭に戻ることになります。こうして1フレームに1回、flagをチェックします。flagがtrueになればwhileループから抜け、
Debug.Log("●●●フラグが立ったよ")
が実行されます。

 yield にはいろいろな書き方があるみたいです。前回、今回で

yield return new WaitForSeconds(1f)
yield return new WaitForEndOfFrame()

というのが出てきました。どちらも「実行をいつまで止めておくか」を意味する書き方でした。多分このくらいでもいろいろ使えて便利そうです。