質問: 0; } } } } ``` この中の、 ``` while (wave.transform.childCount != 0) { yield return new WaitForEndOfFrame (); } ``` の部分ですが、wave.transform.childCount != 0がfalseになった時に次のDestroy (wave);まで進むことができるという機能になっているかと思います。 しかし、このwhile文でなぜそうなるのか、ということが理解できません。 WaitForEndOfFrame のドキュメントの説明を見ると、「スクリーン上のレンダリングが完了するまで待ちます。」とあります。なぜレンダリングの話がでてくるのでしょうか。 また、wave.transform.childCount != 0がfalseになった時にDestroy (wave);に移るということは、もしかするとtrueの間はyield return new WaitForEndOfFrame ();はcontinueのような使われ方で、ループの先頭に戻る役割を担っているのでしょうか。つまり、falseになった瞬間にcontinueしなくなったので、次に進めたということかな、と。(だとしてもドキュメントの説明とつながらないように思えます) 何卒ご教授頂けると嬉しいです。
回答: 質問主さんの仰る通り、「IEnumerator Start()」がコルーチンです。 「WaitForEndOfFrame」はレンダリング完了までの時間を指しますが、 このレンダリングというのは、いわゆる「フレーム」とほぼ同義です。 60fpsなら約0.016秒、30fpsなら0.033秒となります。 「yield return」は「一旦処理を中断し、returnの後ろに書かれた時間だけ待機し、その後次の行から再開する(=待機する)」命令です。 もしyield returnを挟まない場合、ずっと処理が続く為、それが完了するまで入力を受け付けることも出来ず画面が固まることになります。 (Unityの仕様上1つのプログラムの動作中は基本的に他のプログラムは動作せず、画面再描画(=レンダリング)もされない為) なので実際の挙動は 「(wave.transform.childCount != 0)を判定→trueだった→yield returnで処理中断→レンダリングや入力を待つ→レンダリング完了(=1フレーム経過)→(wave.transform.childCount != 0)を再判定→trueだった→処理中断→レンダリングを待つ→......」 という繰り返しになり、結果的に 「Waveの子要素のEnemyが全て削除されるまで待機する」という処理になります。 こちらも参考になるかと思います。 Unity - マニュアル: イベント関数の実行順