IEnumeratorとコルーチン、C#の使い方
ienumerator
コルーチン。C#ではイテレータ構文。
便利ですね。
便利というか、何か挙動やロジックに影響しないエフェクト書きたかったら、
コルーチンで書きたくなるのが人の思考ってもんよ。
yield return nullやWaitForSecondsなら、
全てのUpdate()の後に実行される事だけ意識すればOK。
使うだけなら何も難しくない。
Unityのライブラリは構造が洗練されているので、自分で制御するより楽。
停止と再開も自前で実装する必要がないし、とても使いやすい。
そんなですが、コルーチンを支えてるC#の文法の歴史を覚書してみます。
要約するとこんな言語機能です。
仕組みはデザパタのイテレータそのままです。
コルーチン。C#ではイテレータ構文。
便利ですね。
便利というか、何か挙動やロジックに影響しないエフェクト書きたかったら、
コルーチンで書きたくなるのが人の思考ってもんよ。
yield return nullやWaitForSecondsなら、
全てのUpdate()の後に実行される事だけ意識すればOK。
使うだけなら何も難しくない。
Unityのライブラリは構造が洗練されているので、自分で制御するより楽。
停止と再開も自前で実装する必要がないし、とても使いやすい。
そんなですが、コルーチンを支えてるC#の文法の歴史を覚書してみます。
要約するとこんな言語機能です。
【1. .NET1.0とforeachとイテレータ】
.NET1.0時代、foreachを実現するための仕組みとして登場仕組みはデザパタのイテレータそのままです。
・コレクションに、IEnumerableを実装し。イテレータを取得できるようにする
・イテレータそのものを表すのが、IEnumerator
・実際は「IEnumerableなしでも、GetEnumerator()が宣言されていればOK」(特殊文法)
・実際は「IEnumerableなしでも、GetEnumerator()が宣言されていればOK」(特殊文法)
【2. .NET2.0とイテレータ構文(イテレータブロック)】
.NET2.0時代に、yield return(中断)、yield break(終了)を使う構文が追加されました。
IEnumerableかIEnumeratorを返すメソッド=イテレータブロックにて使用可能です。
匿名メソッドと同じく無名○○系に見られる実装の簡略化が目的で、
イテレータを明示的にクラスとして定義する必要がなくなりました。
Unityで使用される書き方も、この仕組みを転用したものになります。
IEnumerableかIEnumeratorを返すメソッド=イテレータブロックにて使用可能です。
匿名メソッドと同じく無名○○系に見られる実装の簡略化が目的で、
イテレータを明示的にクラスとして定義する必要がなくなりました。
Unityで使用される書き方も、この仕組みを転用したものになります。
【3. Unityのコーチン】
・StartCoroutine(IEnumerator)でUnityのイベント発生に基づいてコルーチンできる。
・StopCoroutine(IEnumerator)で、該当のコルーチンを停止できる。再開もできる。
・yield returnする時、以下を返すと、nullと異なる再開タイミングになる
・WaitForSeconds(X) 指定した時間が経過するまで待機
・WaitForFixedUpdate() 次の物理演算終了後まで待機
・StartCoroutine(IEnumerator) 渡したコルーチンが終了するまで待機
・WaitForSeconds(X) 指定した時間が経過するまで待機
・WaitForFixedUpdate() 次の物理演算終了後まで待機
・StartCoroutine(IEnumerator) 渡したコルーチンが終了するまで待機
・コルーチンの終了部にyield return hogeで、Currentから戻り値を得られる
・GameObjectが非アクティブになると動作を停止する
・コンポーネントがdisableになっても、動作は継続する
yield return で戻り値を返すことで、
イテレータ.Currentで戻り値を取得するという使い方が、なんともギーグな感じ。
yield return で戻り値を返すことで、
イテレータ.Currentで戻り値を取得するという使い方が、なんともギーグな感じ。