Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

非MonoBehaviourクラスでコルーチンを使う

参考:

unitygeek.hatenablog.com

コルーチンを使うには、

StartCoroutine(戻り値IENumeratorのメソッド)

と記述する。

StartCoroutine()はMonoBehaviourクラスのメソッドである(Unity - Scripting API: MonoBehaviour.StartCoroutine)。

MonoBehaviour継承クラスは、new クラス名インスタンス化することは禁じられている(補足参照)。

通常は、GameObjectにアタッチし、'GetComponent<クラス名>()‘で取得する。

しかし、コルーチンを実行時にインスタンス化して使いたい場合も多々ある。たとえば、指定したURLやパスからデータを読み込むクラスはStartCoroutineが必須になるが、オブジェクトにアタッチして使う必然性はないし、意味的にも混乱する。

この対応策のひとつとして、「インスタンス化するクラスで、MonoBehaviour継承クラスのインスタンスを作る」方法がある。

つまり、StartCoroutine()を使うためだけの、MonoBehaviour継承インスタンススクリプトで作成し、そのStartCoroutineを呼ぶ。

例:

 public class MyStartCoroutine
    {

        public WWW GetWebImageAsByteArray(string imageFilePath)
        {
            IEnumerator coroutine = GetWWW(imageFilePath); //StartCoroutineに渡すIENumeratorインスタンス

            var myMono = new MyMonoBehaviour(); //StartCoroutineを使うためのカスタムクラス
            myMono.CallStartCoroutine(coroutine); //カスタムクラス内でStartCoroutineを呼ぶメソッド

            return www;
        }

    //StartCoroutineに渡すIEnumeratorの実装
        private IEnumerator GetWWW(string url)
        {
            www = new WWW(url);
            yield return www;
        }
    }

    //StartCoroutine()メソッドを使うために定義したMonoBehaviour継承クラス
    public class MyMonoBehaviour : MonoBehaviour
    {
        public void CallStartCoroutine(IEnumerator iEnumerator)
        {
            StartCoroutine(iEnumerator); //ここで実際にMonoBehaviour.StartCoroutine()を呼ぶ
        }
    }

(補足)

実際には、フィールドなどの定義に不足・矛盾がなければ、MonoBehaviour継承クラスを'new …‘でインスタンス化しても、(警告はでるが)ビルドは通る。が、あまりよい使い方ではない。