ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - コルーチン(co-routine)

初めに

 通常、関数で行なわれるすべてのアクションは 1フレーム内で行われます。そのため、時間経過や関数の処理を一時停止させることは普通の関数には不向きです。そこで、指定時間待った後に後続の処理を続けたり、1フレームごとに処理をさせたりすることができるコルーチンという特別な関数があります。本記事では、コルーチンについてまとめます。



コルーチン(co-routine)

コルーチンとは

コルーチンとは、

コルーチンとは、実行を停止して Unity へ制御を戻し、その次のフレームで停止したところから続行することができる関数
戻り値の型が IEnumerator で、yield return ステートメントを内部に持つことを宣言した関数

のことです。

 通常の関数は、1フレームで処理されます。そのため、下のスクリプトのようにアルファ値を 0 にして、フェードさせる処理を通常の関数で行うと、一気にアルファ値が 0 になり、フェードではなく、すぐに透明になります。

void Fade() 
{
    for (float f = 1f; f >= 0; f -= 0.1f) 
    {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
    }
}

 そこで、コルーチンを使うことで一時停止させることができるようになり、フェードの処理ができるようになります。

IEnumerator Fade()   //コルーチンでは IEnumerator にする
{
    for (float f = 1f; f >= 0; f -= 0.1f) 
    {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return null;  //1フレーム待つ処理
    }
} 
非同期処理

 コルーチンは非同期処理になります。非同期処理については、下のリンク先の記事をご覧ください。

fineworks-fine.hatenablog.com

コルーチンの呼び出し

 コルーチンを呼び出すには、Monobehavior 内にある StartCoroutine 関数を使います。

public class Test : MonoBehaviour  //Monobehaviorを継承
{
    void Start()
    {
        StartCoroutine("Fade");  //コルーチンの開始
        //StartCoroutine(Fade()); も可
    }

    IEnumerator Fade()   //コルーチンでは IEnumerator にする
    {
        for (float f = 1f; f >= 0; f -= 0.1f) 
        {
            Color c = renderer.material.color;
            c.a = f;
            renderer.material.color = c;
            yield return null;  //1フレーム待つ処理
        }
    } 
}
一時停止、終了(yield return、yield break)

機能 説明
yield return null 1フレーム分処理を停止、次のフレームで続きの行を処理
yield break コルーチンを途中で終了、再開はできない
yield return new WaitForSeconds(float seconds) 指定した seconds 秒、コルーチンを中断する
yield return new WaitUntil(Func predicate) predicate の関数の返り値が true になったら処理を再開する
yield return new WaitWhile(Func predicate) predicate の関数の返り値が false になったら処理を再開する
yield return StartCoroutine() 指定したコルーチンを実行、完了するまで後続処理
yield return new WaitForEndOfFrame() スクリーン上のレンダリングが完了するまで待つ
yield return new WaitForFixedUpdate() FixedUpdate 関数が呼び出されるまで待つ
yield return new WaitForSecondsRealtime(float seconds) スケール化されていない時間を使用して、指定した秒数の間コルーチンの実行を一時停止させる

コルーチンの終了

 コルーチンを停止させるには、StopCoroutine または StopAllCoroutines を使います。

StopCoroutine:この Behaviour 上で実行されている methodName という名のコルーチン、または routine として保持されているコルーチンをすべて停止する
public void StopCoroutine (string methodName);
public void StopCoroutine (IEnumerator routine);
public void StopCoroutine (Coroutine routine);

StopAllCoroutines:Behaviour 上で実行されているコルーチンをすべて停止する
public void StopAllCoroutines ();

最後に

  • コルーチンとは、実行を停止して Unity へ制御を戻し、その次のフレームで停止したところから続行することができる関数
  • 戻り値の型が IEnumerator で、yield return ステートメントを内部に持つ
  • コルーチンを呼び出すには、Monobehavior 内にある StartCoroutine 関数を使う
  • コルーチンを停止させるには、StopCoroutine または StopAllCoroutines を使う