質問: 1から5の数字が書かれたUITextが5つあるとして、start()内に処理を記述し1から順番に「1秒間フォントサイズを大きくしてもとのサイズに戻す」という処理を繰り返し、処理が全て終わってから後続の処理を進めるという実装を行いたいです。 (1〜5が一つづつ1秒間フォントをサイズアップして目立たせる演出という意図です) いろいろ試しましたが、この「全部終わったら次の処理へ進む」ための「1秒間ずつ待つ」という部分の実装が難しくて困っています。 たとえば、start()からコルーチンとして1秒待ち処理を呼んでもstart()がコルーチンの処理を終わるまで待つことができないのですぐに次の処理に進んでしまいます。 コルーチン内で1秒づつ5文字全てを大きくするような処理にした場合、見た目は意図した通りに動くのですが、start()の処理が並行して先に進んでしまうので都合が悪いです。 一番やりたいのは、「start()がコルーチンの終了まで待ってから後続処理を行う」なのですが、そのような方法はあるのでしょうか? そのような方法がない場合、一般的にはどのような方法で先述のような処理を実装しているのでしょうか? 連休を使って色々試していましたが、思う結果に出会えず困り果てています... ヒントや思いつきでも大変助かりますのでコメントいただければと思います。
回答: お探しの動作は下記のような動作でしょうか。 下記のコードは`Text1`~`Text5`の文字を順番に大きくして1秒待って文字を元の大きさに戻します。 それらの処理がすべて終わった後に「次の処理」を実行して文字色を変更します。 `void Start()`では`yield`が使えないので、`IEnumerator Start()`にしてコルーチンの`WaitForSeconds`を待つのがポイントです。 ``` using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; public class NewBehaviourScript : MonoBehaviour { // Use this for initialization IEnumerator Start() { foreach (var i in Enumerable.Range(1, 5)) { var objName = string.Format("Text{0}", i); yield return StartCoroutine("Coroutine", objName); } //次の処理 foreach (var i in Enumerable.Range(1, 5)) { var text = GameObject.Find(string.Format("Text{0}", i)).GetComponent(); text.color = Color.red; } } IEnumerator Coroutine(string objName) { var text = GameObject.Find(objName).GetComponent(); text.fontSize += 30; //1秒待ってフォントを元に戻す yield return new WaitForSeconds(1f); text.fontSize -= 30; } } ```