【Unity】MonoBehaviourを使わずコルーチンを回したい

DEVELOP, Unity

Unityでコルーチンを使うには、UnityEngineに既に用意されているStartCoroutineメソッドを使用するのが一般的かと思います。

public class TestCoroutine : MonoBehaviour
{
    void Start ()
    {
        this.StartCoroutine(CustomProcess());
    }
}

こんな感じで呼べますよね。でも、C#本来の書き方で実装することも可能で、

using UnityEngine;
using System.Collections;
public class TestCoroutine : MonoBehaviour
{
    private IEnumerator m_Enumerator;
    void Start ()
    {
        m_Enumerator = CustomProcess();
    }
    IEnumerator CustomProcess()
    {
        Debug.Log("wait");
        yield return null;
        Debug.Log("Complete!!!");
        yield break;
    }
    void Update ()
    {
        if( m_Enumerator != null )
        {
            // 次のフレームへ進めている。
            bool result = m_Enumerator.MoveNext();
            if (result)
            {
                Debug.Log("Next.");
            }
            else
            {
                // コルーチン終了。
                Debug.Log("End.");
                m_Enumerator = null;
            }
        }        
    }
}

この様に書くことも出来ます。StartCoroutineやStopCoroutineに縛られず、MoveNextを呼ばなければ一時停止に出来る点や、MonoBehaviourを継承しなくても使えるため、使い方を間違えなければ柔軟な処理を書くことが可能になります。

とはいえ、Unity5.3よりカスタムコルーチンが実装されてコルーチン内で呼ぶコルーチンはStartCorouitneを呼ばなくて良くなったりしていますので、恩恵は薄いかもしれませんがいろんな方法を知っておくと夢が広がるとは思います。

Posted by kazupon