TL;DR
- Unity 5.3 から
yield return StartCoroutine(SubCoroutine())
ではなくyield return SubCoroutine()
と書けるようになっていた。 - 新しいほうだと
StopCoroutine
で子供のコルーチンの中でも止まる。
きっかけ
宴 のソースコードを見ていたら、 yield return StartCoroutine(SubCoroutine())
ではなく yield return SubCoroutine()
と書かれていて、 StartCoroutine
要らないの?! と思ったのがきっかけ。
http://madnesslabo.net/utage/?p=6633 によると Unity 5.3 から StartCoroutine
なしで動くようになったようですね。
入れ子のコルーチンは StopCoroutine
で止められないという話もあったので、ついでに動作確認してみました。
やってみた
動作確認したのは Unity 5.5.2f1
using System.Collections;
using UnityEngine;
public class NestCoroutine : MonoBehaviour
{
private IEnumerator _coroutine;
private int _count;
private int Count
{
get
{
return _count;
}
set
{
_count = value;
Debug.Log(_count);
}
}
private void Start()
{
Count = 0;
_coroutine = MainCoroutine();
StartCoroutine(_coroutine);
}
[ContextMenu("StopCoroutine")]
private void StopCoroutine()
{
Debug.LogWarning("Stop");
StopCoroutine(_coroutine);
}
[ContextMenu("RestartCoroutine")]
private void RestartCoroutine()
{
Debug.LogWarning("Restart");
StartCoroutine(_coroutine);
}
private IEnumerator MainCoroutine()
{
for (int i = 1; i <= 5; i++)
{
yield return new WaitForSeconds(1);
Count = i;
}
yield return StartCoroutine(SubCoroutine());
yield return SubCoroutine();
yield return new WaitForSeconds(1);
Count = 99;
}
private IEnumerator SubCoroutine()
{
var last = Count + 5;
for (int i = Count + 1; i <= last; i++)
{
yield return new WaitForSeconds(1);
Count = i;
}
}
}
StopCoroutine と RestartCoroutine は手動です。
結果
yield return StartCoroutine(SubCoroutine())
だと SubCoroutine
が終わるまで止まらない。
yield return SubCoroutine()
だと SubCoroutine
の途中で止まる。
入れ子のコルーチンを StartCoroutine
で再開するのは無理そう。
結論
Unity 5.3 以前に対応するとかでなければ StartCoroutine
を使う必要はなさそうですね。