コルーチンの使い方
この記事では、Unityでコルーチンを使う方法について説明します。
コルーチンとは
コルーチンとは、処理を途中で中断し、任意のタイミングで再開できる機能を持った関数です。コルーチンはメインスレッドで実行されており、「並行処理」に当たります。
コルーチンを使うことで、「状態遷移を行う処理を分かりやすい形で記述すること」や、「待ち時間の大きい処理を分割し、画面の更新を止めないようにすること」などができます。
作り方
コルーチンを作るには、System.Collections
.IEnumerator
型を戻り値とする( yield
文を内部に持つ )関数を定義します。それにより、その関数をコルーチンとして扱うことができます。
IEnumerator Example()
{
// 処理
}
使い方
コルーチンを実行する
コルーチンを実行するには、MonoBehaviour
クラスのメンバ関数であるStartCoroutine
関数を使用します。
StartCoroutine
関数の引数には、「コルーチンの戻り値( IEnumerator
型 )」を指定します。
StartCoroutine( Example() );
コルーチンを中断する
コルーチンを中断するには、yield return
文を使用します。
コルーチン内で「yield return 戻り値;
」という文を記述することで、その文が実行された時にコルーチンを中断できます。中断したコルーチンは、yield return
文の戻り値に応じた時間だけ待機したのち、処理を再開します。
よく使用する戻り値
yield return
文でよく使用する戻り値は下記の通りです。
戻り値 | 待機時間 |
---|---|
null | 1フレーム待機します( 描画前に処理を再開 )。 |
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 );