おれ、Unity2Dでゲーム作るんだ。

Unity2Dをメインに、覚書などを記事にしていきます。

Unity - コルーチンってなに?

f:id:xev:20150124023327p:plain

コルーチンとは?

通常は、関数が始まるとreturnされるまでを1セットとして処理される訳ですが、 コルーチンは、処理の途中で一旦中断して、次のフレームでその続きから再開できたりする事ができます。

たとえば、「フェードアウトさせたい!」と思って以下のコードを書いたとします。

void Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
    }
}

しかし、実際はこれだと突然消えるわけです。forの中でずっと透明度を変化させてますから、 forを抜けたときには見えなくなってます。

コルーチン使って処理中断

じゃあ、その時に役に立つのがコルーチン。戻り値に IEnumerator を指定して使います。

で、 yield return を内包させます。このyield returnのところで処理をUnityに返すわけです。 すると、透明度がちょっと変化した状態で描画され、そして、また次のフレームからforの処理が再開されるわけです。

IEnumerator Fade()
{
    for (float f = 1f; f >= 0; f -= 0.1f)
    {
        Color c = image.color;
        alpha = f;
        c.a = alpha;
        image.color = c;
        yield return new WaitForSeconds(.1f);
    }
}

あと、コルーチンを呼ぶときは↓の様に呼ぶ。

StartCoroutine("Fade");

これで徐々に変化していって消えていく処理ができます。

コルーチン便利。

http通信での利用例

前の投稿では、コルーチンをwwwの通信待機に使っています。

public IEnumerator Start(){
    // ダウンロード処理
    var www = WWW.LoadFromCacheOrDownload(url, 1);
    while (!www.isDone)
    {
        yield return null;
    }
}

参考

こんな感じで、通信が完了するまで待って待ってる間は、表示をいろいろしておく感じでつかえますかね。