箱庭ハーブblog

7年目プログラマの趣味の小部屋

IEnumeratorとコルーチン、C#の使い方

ienumerator



コルーチン。C#ではイテレータ構文。
便利ですね。

便利というか、何か挙動やロジックに影響しないエフェクト書きたかったら、
コルーチンで書きたくなるのが人の思考ってもんよ。

yield return nullやWaitForSecondsなら、
全てのUpdate()の後に実行される事だけ意識すればOK。
使うだけなら何も難しくない。

Unityのライブラリは構造が洗練されているので、自分で制御するより楽。
停止と再開も自前で実装する必要がないし、とても使いやすい。

そんなですが、コルーチンを支えてるC#の文法の歴史を覚書してみます。

要約するとこんな言語機能です。

【1. .NET1.0とforeachとイテレータ】

.NET1.0時代、foreachを実現するための仕組みとして登場
仕組みはデザパタのイテレータそのままです。
 ・コレクションに、IEnumerableを実装し。イテレータを取得できるようにする
 ・イテレータそのものを表すのが、IEnumerator
 ・実際は「IEnumerableなしでも、GetEnumerator()が宣言されていればOK」(特殊文法)

【2. .NET2.0とイテレータ構文(イテレータブロック)】

.NET2.0時代に、yield return(中断)、yield break(終了)を使う構文が追加されました。
IEnumerableかIEnumeratorを返すメソッド=イテレータブロックにて使用可能です。
匿名メソッドと同じく無名○○系に見られる実装の簡略化が目的で、
イテレータを明示的にクラスとして定義する必要がなくなりました。
Unityで使用される書き方も、この仕組みを転用したものになります。

【3. Unityのコーチン】

・StartCoroutine(IEnumerator)でUnityのイベント発生に基づいてコルーチンできる。
・StopCoroutine(IEnumerator)で、該当のコルーチンを停止できる。再開もできる。
・yield returnする時、以下を返すと、nullと異なる再開タイミングになる
  ・WaitForSeconds(X) 指定した時間が経過するまで待機
  ・WaitForFixedUpdate() 次の物理演算終了後まで待機
  ・StartCoroutine(IEnumerator) 渡したコルーチンが終了するまで待機
・コルーチンの終了部にyield return hogeで、Currentから戻り値を得られる
・GameObjectが非アクティブになると動作を停止する
・コンポーネントがdisableになっても、動作は継続する

yield return で戻り値を返すことで、
イテレータ.Currentで戻り値を取得するという使い方が、なんともギーグな感じ。
コメント
PAGETOPへ

コメント送信

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード

パスワードを入れておかないと、コメントの再編集ができません!

フリーエリア

takemori
Twitter : @takemori_kondo

1. Unityと戯れてます
2. Cake3は劣化じゃないRails

iOS
coming soon...

Windows
Html Editor - Nazuna
Managed DirectX サンプル集

beginning since
2006.08.17
renewaled on
2011.06.03

最新コメント

[2013/06/14 ミューネ]
[2012/08/30 ノートPC]