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

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

Unityで、ひとつのコルーチンを2回呼ぶとどうなるか

 

ゲームの開発作業中、必要があって実験しました。コルーチンを実行中に、同じコルーチンを呼んだらどうなるのでしょうか。例えば
StartCoroutine(test());
StartCoroutine(test());
のように。

実験のため、コルーチンtest()を以下のように定義しておきます。
//------------------------------
    IEnumerator test() {
        DateTime now = DateTime.Now;
        int ms = now.Millisecond;
        int ct = 0;
        for (int i = 0; i < 10; i++) {
            Debug.Log(ms + "■" + ct);
            ct++;
            yield return new WaitForSeconds(1f);
        }
        yield break;
    }
//------------------------------
変数msにはコルーチン実行時、最初にそのときの時刻のミリ秒(1秒未満)が入ります。同じコルーチンを呼ぶので、「最初に呼んだコルーチンか後のコルーチンか、こうすれば区別が付くかな……?」というわけです。変数を1秒毎にカウントアップして表示するだけの単純なコルーチンです。

このコルーチンを2回呼ぶため、次のコルーチンtest1()を用意します。
//------------------------------
    IEnumerator test1() {
        Coroutine cr, cr1;
        cr = StartCoroutine(test());
        yield return new WaitForSeconds(3f);
        cr1 = StartCoroutine(test());
        yield return new WaitForSeconds(3f);
        StopCoroutine(cr);
        yield break;
    }
//------------------------------
まずtest()を実行し、3秒後(まだtest()を実行中)に再びtest()を実行します。さらに3秒後、最初のコルーチンを破棄するつもりのコードです。

 

実際にどうなるのか、
StartCoroutine(test1());
を実行してみます。結果は……

348■0
348■1
348■2
274■0
348■3
274■1
348■4
274■2
348■5
274■3
274■4
274■5
274■6
274■7
274■8
274■9

1つ目のコルーチンからの出力が赤字、2つ目のコルーチンからの出力が黒字です。独立して動いているのが分かります。また、StopCoroutine(cr)ではひとつ目のコルーチンが止まることが分かります。予想通りというか、そうでなければ困るというか、そういう結果でした。

 

ゲームは遊び方や広告も入れて今週中にあらかた作り終える予定です。公開したら、休憩などせずすぐ次のアプリに取りかかります。何か、面白いジャンルのゲーム(一般のアプリでもいいけれど)、ないかな……。