コルーチンの使い方

2020年11月9日

この記事では、Unityでコルーチンを使う方法について説明します。

コルーチンとは

コルーチンとは、処理を途中で中断し、任意のタイミングで再開できる機能を持った関数です。コルーチンはメインスレッドで実行されており、「並行処理」に当たります。

コルーチンを使うことで、「状態遷移を行う処理を分かりやすい形で記述すること」や、「待ち時間の大きい処理を分割し、画面の更新を止めないようにすること」などができます。

作り方

コルーチンを作るには、System.Collections.IEnumerator型を戻り値とする( yield文を内部に持つ )関数を定義します。それにより、その関数をコルーチンとして扱うことができます。

IEnumerator Example()
{
    // 処理
}

使い方

コルーチンを実行する

コルーチンを実行するには、MonoBehaviourクラスのメンバ関数であるStartCoroutine関数を使用します。

StartCoroutine関数の引数には、「コルーチンの戻り値( IEnumerator型 )」を指定します。

StartCoroutine( Example() );

コルーチンを中断する

コルーチンを中断するには、yield return文を使用します。

コルーチン内で「yield return 戻り値;」という文を記述することで、その文が実行された時にコルーチンを中断できます。中断したコルーチンは、yield return文の戻り値に応じた時間だけ待機したのち、処理を再開します。

よく使用する戻り値

yield return文でよく使用する戻り値は下記の通りです。

戻り値待機時間
null1フレーム待機します( 描画前に処理を再開 )。
new WaitForEndOfFrame()1フレーム待機します( 描画後に処理を再開 )。
new WaitForSeconds( 秒数 )指定した秒数だけ待機します。
new WaitUntil( 条件 )条件trueになるまで待機します。
new WaitWhile( 条件 )条件がtrueの間、待機します。
Coroutineオブジェクト
( StartCoroutine関数の戻り値 )
そのコルーチンの処理が完了するまで待機します。

IEnumerator Example() 
{
    Debug.Log( "Example関数を開始しました。" );

    for ( var i = 0; i < 10; i++ ) yield return null;
    Debug.Log( "10フレーム待機しました。" );

    yield return new WaitForSeconds( 5.0f );
    Debug.Log( "5秒待機しました。" );

    yield return StartCoroutine( AnotherExample() ); 
    Debug.Log( "AnotherExample関数が完了するまで待機しました。" );

    Debug.Log( "Example関数を終了しました。" );
}

IEnumerator AnotherExample() 
{
    Debug.Log( "AnotherExample関数を開始しました。" );

    yield return new WaitUntil( () => Random.Range( 0, 100 ) == 99 );
    Debug.Log( "「0」から「99」の範囲の乱数が「99」と一致するまで待機しました。" );

    Debug.Log( "AnotherExample関数を終了しました。" );
}

コルーチンを停止する

コルーチンを停止するには、「yield break文」、または「StopCoroutine関数」を使用します。

yield break

コルーチン内で「yield break;」という文を記述することで、その文が実行された時にコルーチンを停止できます。

IEnumerator Example() 
{
    yield break;
    Debug.Log( "コルーチンを停止したため、ここには到達しません。" );
}

StopCroutine関数

コルーチン外でMonoBehaviourクラスのメンバ関数であるStopCoroutine関数を呼び出すことで、コルーチンを停止できます。

StopCoroutine関数の引数には、「コルーチンの戻り値」、または「Coroutineオブジェクト」を指定します。

var return_value_of_coroutine = Example();
StartCoroutine( return_value_of_coroutine );
StopCoroutine( return_value_of_coroutine );

var coroutine = StartCoroutine( Example() );
StopCoroutine( coroutine );

参考ページ