ゲームの開発作業中、必要があって実験しました。コルーチンを実行中に、同じコルーチンを呼んだらどうなるのでしょうか。例えば
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)ではひとつ目のコルーチンが止まることが分かります。予想通りというか、そうでなければ困るというか、そういう結果でした。
ゲームは遊び方や広告も入れて今週中にあらかた作り終える予定です。公開したら、休憩などせずすぐ次のアプリに取りかかります。何か、面白いジャンルのゲーム(一般のアプリでもいいけれど)、ないかな……。