LoginSignup
5
5

More than 5 years have passed since last update.

Coroutine(コルーチン)入門メモ

Posted at

はじめに

Unity 学習の一環としてコルーチンを勉強中。
学んだことをメモする。

コルーチンとは

通常、関数呼び出しでの処理は一つのフレームで行われる。
アニメーションなど視覚的な変化を実装するには複数フレームにわたって処理を行う必要がある。
Updateで頑張ることもできるが、コルーチンを用いることで簡易に実装できる。

基本的な実装

MonoBehaviour.StartCoroutine で実行する。
実行方法は2種類ある。

  1. 関数名を文字列で指定する。
  2. 引数指定時に関数呼び出しを行う。

以下は、関数名指定の形式で1秒おきにログ出力する例。

    void Start()
    {
        StartCoroutine("Test");
    }

    IEnumerator Test()
    {
        for (int i = 0; i < 100; i++)
        {
            Debug.Log("test:" + i);
            yield return new WaitForSeconds(1);
        }
    }

IEnumerator型を戻り値とし、yield returnを含むのが特徴。
yield return new WaitForSeconds(1);で処理が中断され、1秒後に再開される。
他にも次フレームまで、レンダリング完了まで、など指定できる。

関数名指定の特徴

コルーチンの停止が容易

StopCoroutineで関数名を指定すればコルーチンを停止できる。
再度StartCoroutineするとコルーチンが最初から実行される。

呼び出す関数に対して一つだけ引数を指定できる

こんな感じ。

void Start()
    {
        StartCoroutine("Test", 3);
    }

    IEnumerator Test(int wait)
    {
        for (int i = 0; i < 100; i++)
        {
            Debug.Log("test:" + i);
            yield return new WaitForSeconds(wait);
        }
    }

オーバーヘッドが大きい

公式ドキュメント(MonoBehaviour.StartCoroutine)を参照。(ごめんなさい自分で確認してないです)

関数呼び出し形式の特徴

コルーチンの停止には変数を用いる

名前指定ではコルーチンを停止できないため、IEnumerator型の変数を用いる必要がある。
ちなみに変数に保持することで、停止したタイミングから処理を再開できる。

    IEnumerator test;

    void Start()
    {
        test = Test(1);
        StartCoroutine(test);
    }

    IEnumerator Test(int wait)
    {
        for (int i = 0; i < 100; i++)
        {
            Debug.Log("test:" + i);
            yield return new WaitForSeconds(wait);
        }
    }

    void Update () 
    {
        // 左クリックでコルーチン停止、A ボタン押下でコルーチン再開
        if (Input.GetMouseButtonDown(0)) {
            StopCoroutine(test);
        } else if (Input.GetKeyDown(KeyCode.A)) {
            StartCoroutine(test);
        }
    }

引数を複数指定できる

StartCoroutineの引数として関数を呼び出すだけなので、引数の数に上限はない。

参考

公式ドキュメント(コルーチン)
公式ドキュメント(MonoBehaviour.StartCoroutine)
Unityのコルーチンの使い方をまとめてみた

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5