はじめに
Unity 学習の一環としてコルーチンを勉強中。
学んだことをメモする。
コルーチンとは
通常、関数呼び出しでの処理は一つのフレームで行われる。
アニメーションなど視覚的な変化を実装するには複数フレームにわたって処理を行う必要がある。
Update
で頑張ることもできるが、コルーチンを用いることで簡易に実装できる。
基本的な実装
MonoBehaviour.StartCoroutine で実行する。
実行方法は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のコルーチンの使い方をまとめてみた