teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

誤記訂正

2017/12/03 15:43

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -75,6 +75,6 @@
75
75
  ... elementに対する処理 ...
76
76
  }
77
77
  ```
78
- (1)が典型的な使い方ですが、これではUpdateの1回の呼び出しで1世代のみを取り出すことができません。そこで(2)の方法に着目します。(2)なら「まだ次の要素があるかをMoveNext()で調べ、もしあるならその要素をCurrentでアクセスする」というのをUpdateの中で1回だけ行えます。(A)はIEnumerableの計算を開始するためのコードのため上の例ではStartにきましたが、なんども繰り返しGAを実行したいなら、適当なタイミングで(Startメソッド以外の場所で)
78
+ (1)が典型的な使い方ですが、これではUpdateの1回の呼び出しで1世代のみを取り出すことができません。そこで(2)の方法に着目します。(2)なら「まだ次の要素があるかをMoveNext()で調べ、もしあるならその要素をCurrentでアクセスする」というのをUpdateの中で1回だけ行えます。(A)はIEnumerableの計算を開始するためのコードのため上の例ではStartにきましたが、なんども繰り返しGAを実行したいなら、適当なタイミングで(Startメソッド以外の場所で)
79
79
  `generator = GA().getEnumerator();`
80
80
  とすれば何度でも新たな列挙をやりなおせます。

2

誤記訂正

2017/12/03 15:43

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -56,8 +56,10 @@
56
56
  コルーチンの動きが実感できてくると「単純なループ構造で書かれた関数を、データを次々と生み出すもの(ジェネレーター)として利用できる」「独立したプログラムの流れを複数並行して動かすことができる=>スレッドを生成せずにスレッド的な動きにできる」といった応用が見えてくると思います。
57
57
 
58
58
  ---
59
- 補足:上のコードが少々わかりにくかったかも知れませんね。コルーチンで実装されたジェネレーターの典型的な使い方はforeachでの利用なのですが、それと対比すると理解しやすいかも知れません。IEnumerable<T>というのはT型のデータを列挙するものとして捉えてください。(これはUnityの仕様ではなくC#の標準ライブラリーの仕様です)
59
+ 補足:上のコードが少々わかりにくかったかも知れませんね。コルーチンで実装されたジェネレーターの典型的な使い方はforeachでの利用なのですが、それと対比すると理解しやすいかも知れません。
60
60
 
61
+ IEnumerator<T>はT型の要素を列挙する能力を持つ型です。(foreachなどを使うとこの型を直接目にしないため見慣れないかも知れません)。またIEnumerable<T>というのはIEnumerator<T>を生成する能力がある型で大抵のコレクション型(配列, List, Dictionaryなど)はこのインターフェースを備えています。(これはUnityの仕様ではなくC#の標準ライブラリーの仕様です)
62
+
61
63
  ```C#
62
64
  IEnumerable<T> GetGenerator() { ... }
63
65
 

1

補足

2017/12/03 07:13

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -53,4 +53,26 @@
53
53
 
54
54
  おそらくUnityのコルーチンをいきなり読むと「いったいコルーチンって何!?」と感じるのではないかと想像しますが、先に「一般的なコルーチンとは何をするものか」を抑えておくとよいと思います。
55
55
 
56
- コルーチンの動きが実感できてくると「単純なループ構造で書かれた関数を、データを次々と生み出すもの(ジェネレーター)として利用できる」「独立したプログラムの流れを複数並行して動かすことができる=>スレッドを生成せずにスレッド的な動きにできる」といった応用が見えてくると思います。
56
+ コルーチンの動きが実感できてくると「単純なループ構造で書かれた関数を、データを次々と生み出すもの(ジェネレーター)として利用できる」「独立したプログラムの流れを複数並行して動かすことができる=>スレッドを生成せずにスレッド的な動きにできる」といった応用が見えてくると思います。
57
+
58
+ ---
59
+ 補足:上のコードが少々わかりにくかったかも知れませんね。コルーチンで実装されたジェネレーターの典型的な使い方はforeachでの利用なのですが、それと対比すると理解しやすいかも知れません。IEnumerable<T>というのはT型のデータを列挙するものとして捉えてください。(これはUnityの仕様ではなくC#の標準ライブラリーの仕様です)
60
+
61
+ ```C#
62
+ IEnumerable<T> GetGenerator() { ... }
63
+
64
+ //(1) foreachで利用する方法
65
+ foreach (T element in GetGenerator()) {
66
+ ... elementに対する処理 ...
67
+ }
68
+
69
+ //(2) 上記と同じことを別の書き方で書くと
70
+ IEnumerator<T> enumerator = GetGenerator().getEnumerator(); // (A)
71
+ while (enumerator.MoveNext()) { // (B)
72
+ T element = enumerator.Current;
73
+ ... elementに対する処理 ...
74
+ }
75
+ ```
76
+ (1)が典型的な使い方ですが、これではUpdateの1回の呼び出しで1世代のみを取り出すことができません。そこで(2)の方法に着目します。(2)なら「まだ次の要素があるかをMoveNext()で調べ、もしあるならその要素をCurrentでアクセスする」というのをUpdateの中で1回だけ行えます。(A)はIEnumerableの計算を開始するためのコードのため上の例ではStartに起きましたが、なんども繰り返しGAを実行したいなら、適当なタイミングで(Startメソッド以外の場所で)
77
+ `generator = GA().getEnumerator();`
78
+ とすれば何度でも新たな列挙をやりなおせます。