さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】 カスタムコルーチンでこのコールバックからの卒業

 Unity5.3からカスタムコルーチンを使えるぞ!これで何ができるの?いろんな条件で処理を止められるぞ
 ……という他に、コルーチンの戻り値を受け取るのにコールバックを使ってる部分をマシにできたりする。

 普通のコルーチンメソッドで書くとこんな感じなのを

    IEnumerator Routine(System.Action<int> callback)
    {
        var result = 0;
        for (int i = 0; i < 100; ++i)
        {
            yield return null;
            ++result;
        }

        callback(result);
    }

 こう書ける。

public class Keisan : CustomYieldInstruction
{
    public int Result { get; private set; }
    IEnumerator routine;

    public Keisan()
    {
        routine = Routine();
    }

    public override bool keepWaiting
    {
        get
        {
            return routine.MoveNext();
        }
    }

    IEnumerator Routine()
    {
        for(int i=0; i<100; ++i)
        {
            yield return null;
            ++Result;
        }
    }
}

 メソッドで書くほうが短いやんけ!

 まあ、コールバックとかツライときありますし。

 呼び方を比較するとこんな感じ。

IEnumerator Start()
{
    int kekka = 0;
    yield return Routine(result => kekka = result);
    Debug.Log(kekka);

    var keisan = new Keisan();
    yield return keisan;
    Debug.Log(keisan.Result);
}