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

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

コルーチンから起動されたコルーチンは、もとのコルーチンが止まったときどうなるか

コルーチンAがコルーチンBを起動します。Aが止まったとき、Bはどうなるのでしょうか。Aが yield break; で止まったとしましょう。何となく、多分BはAと無関係に動き続けるんだろう、……と考えていました。今までそのつもりでコードを書いていたんですが、思い立って実験してみました。コルーチンtest1()、test2()を用意し、

StartCoroutine(test1());

を実行します。test1()では最初にコルーチンtest2()を実行し、10回のループを回して1秒ごとにカウントアップしながら変数の値を表示します。10回でtest1()は止まります。test2()は1秒ごとに変数をカウントアップし、表示します。

    //----------------------------------

   IEnumerator test1() {
        int ct1 = 0;
        StartCoroutine(test2());
        for(int i = 0; i < 10; i++){
            Debug.Log("ct1 = " + ct1);
            ct1++;
            yield return new WaitForSeconds(1f);
        }
        yield break;
    }
    //----------------------------------
    IEnumerator test2() {
        int ct2 = 0;
        while (true) {
            Debug.Log("ct2 = " + ct2);
            ct2++;
            yield return new WaitForSeconds(1f);
        }
    }
    //----------------------------------

結果は以下の通りです。

ct2 = 0
ct1 = 0
ct2 = 1
ct1 = 1
ct2 = 2
ct1 = 2
……
ct2 = 9
ct1 = 9
ct2 = 10
ct2 = 11
ct2 = 12
……

要するに、やはりコルーチンから実行されたコルーチンは、もとのコルーチンが止まっても動き続けるということです。そりゃそうだよね……ですが、実験は大事です。