コルーチンの初歩的な使い方
コルーチンは処理の開始や停止を別スレッドのようなふるまいでコントロールすることができます。
シーケンシャルなUIの時とかにすごく使えます。
毎フレーム処理
毎フレーム処理を開始します。
yield return のところで
void Start () {
// コルーチンを設定
StartCoroutine(loop());
}
private IEnumerator loop() {
// ループ
while (true) {
// 毎フレームループします
yield return null;
Debug.Log("loop");
}
}
指定のフレーム分だけ処理
10フレームだけ処理を行います。
void Start () {
// コルーチンを設定
StartCoroutine(loop(10));
}
private IEnumerator loop(int frame) {
// ループ
while (frame > 0) {
// frameで指定したフレームだけループします
yield return null;
Debug.Log("loop");
frame--;
}
}
秒数指定
yield return のところをWaitForSecondsにします。
void Start () {
// コルーチンを設定
StartCoroutine(loop(10f));
}
private IEnumerator loop(float second) {
// ループ
while (true) {
// secondで指定した秒数ループします
yield return WaitForSeconds(second);
Debug.Log("loop");
}
}
yield returnの挙動
yield returnのたびに処理が中断して次のフレームまで待つみたいです。
下のサンプルではUpdate内でマイフレーム"update------"を出力していて、コルーチンではyield returnの度に文字列を出力しています。
void Start () {
StartCoroutine (loop ());
}
void Update () {
Debug.Log ("update------");
}
private IEnumerator loop() {
for (int i = 0; i < 5; i++) {
yield return null;
Debug.Log ("loop" + i.ToString());
}
}
yield returnのたびにそのフレームの処理が止まって次のフレームまで待ってます。
updateが最初重なってしまうのはどうしてだろうか。
yield returnとDebug.Logの順番を逆にしたら今度はloop0のあとに2回updateが来てしまいました。
update------
update------
loop0
update------
loop1
update------
loop2
update------
loop3
update------
loop4