読者です 読者をやめる 読者になる 読者になる

Unityのコルーチン

Unityの便利(?)な機能の一つに「コルーチン」というものがあるそうです。

例えば、オブジェクトがだんだん薄くなってフェードアウトする処理を想定し以下のコードを記述したとします。

void フェードアウト() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        1/10くらい透明になる処理();
    }
}

ここで、フェードアウトメソッドを呼び出すと、Unityはすべての処理を1フレームごと行うために
上記forループが1フレーム内で実行されきってしまい、ユーザから見た画面では一瞬で対象のオブジェクトが消えたように見えてしまいます。

この問題、個人的にC++とDxLibで2Dゲームを作っていた時にめっちゃ面倒だった覚えがあるので、
ゲーム作ったことある人ならふむふむという感じかと思います。

ここで、Unityのコルーチンという仕組みを利用したのが以下のコードとなります。

void フェードアウト() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        1/10くらい透明になる処理();
        yield return null;
    }
}

return文にyieldを付与することができます。

すると、この処理はreturn部で一旦(記述通りに)中断しますが、フレームの更新により再度このメソッドにたどり着いた時、yieldで中断した箇所から再開するという仕組みを持つことができます。
この例で言うと、次のフレームはループの2週目の処理を行ってくれるイメージですね。

これによって、エンジニアの想定通り、10フレーム掛けてオブジェクトのアルファを0にするという処理が直感的に実装できるというわけです、


C++とDxLibの頃は、フレームを跨いでループさせるためにグローバルな領域をいかに持つかに傾倒していたので、これは便利そうです。

C++でも、近いうちにyield returnのコルーチン文法を導入するような動きがあるようですね。(もう実装されてるんでしょうか?)

docs.unity3d.com


全然関係ないんですけど、Unity(C#?)はforループの添字にfloatを使うのは一般的なんでしょうか?
Java畑の人間なのですごい違和感です。