コルーチンの使いどき
Unityでゲームを作っていると、次のような処理を書きたくなることがあります。
・数秒待ってから処理を実行したい
・フェードイン、フェードアウトを少しずつ行いたい
・攻撃演出 → ヒット判定 → クールタイム、という流れを作りたい
こうした時間経過を伴う処理を素直に書こうとすると、Update内でフラグ管理をするなど、コードが複雑になりがちです。
そこで登場するのが コルーチン(Coroutine) です。
コルーチンとは
コルーチンとは、 処理の途中で一時停止し、後のフレームで続きを実行できる仕組み です。
通常のメソッドは、呼び出されたら最後まで一気に実行されます。
void Example()
{
Debug.Log("A");
Debug.Log("B");
Debug.Log("C");
}
一方コルーチンでは、処理の途中で「ここで止める」という指定ができます。
IEnumerator Example()
{
Debug.Log("A");
yield return null;
Debug.Log("B");
}
これが、コルーチンの特徴の1つです。
コルーチンの基本文法
コルーチンには、いくつか独特な文法があります。
戻り値はIEnumerator
コルーチンのメソッドは、必ずIEnumeratorを戻り値とします。
IEnumerator SampleCoroutine()
{
// 処理
yield return null;
}
voidなどでは書くことが出来ません。
StartCoroutineで実行する
コルーチンは普通のメソッドのように直接呼び出すことはできません。
StartCoroutine()を使って開始します。
void Start()
{
StartCoroutine(SampleCoroutine());
}
yield returnで処理を一時停止
yield returnの後に何を返すかで、どれくらい待つかが変わります。
次のフレームまで待つ
yield return null;
指定秒数待つ
yield return new WaitForSeconds(1.5f);
条件が満たされるまで待つ
yield return new WaitUntil(() => isReady);
コルーチンを止める
2つ方法があります。
StopCoroutine(coroutine);
StopAllCoroutines();
StopAllCoroutineの方は、同じオブジェクト上で動いている全コルーチンが停止します。