LoginSignup
18
12

More than 5 years have passed since last update.

入れ子のコルーチンを作る新しい方法と止め方

Posted at

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

NestCoroutine.cs
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 は手動です。

結果

スクリーンショット 2017-03-22 21.25.37.png

yield return StartCoroutine(SubCoroutine()) だと SubCoroutine が終わるまで止まらない。
yield return SubCoroutine() だと SubCoroutine の途中で止まる。

入れ子のコルーチンを StartCoroutine で再開するのは無理そう。

結論

Unity 5.3 以前に対応するとかでなければ StartCoroutine を使う必要はなさそうですね。

18
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
12