【Unity】コルーチンで処理を中断・再開・停止させる方法を学ぶ
ゲーム制作において「場面が急に変わるのではなく、時間をかけてゆっくり遷移させたい」や「10秒毎にライフを回復させたい」など、一定の時間で処理を中断・繰り返したい場合はあると思います。
このような場合に使用するのがコルーチンという関数です。
今回はコルーチンについて徹底的に解説していきます。
Contents
コルーチンとは?
コルーチン(Coroutine)とは一定の時間や条件をもとに処理を中断・再開・終了させることができる処理のかたまり(関数)のことです。
Start関数やUpdate関数は基本的に処理は止まることなくどんどん実行されるのですが、 コルーチンを加えることで処理の中に意図的な何もしない時間を作ることができるのです。
Waitのような一定時間を置いて処理を行いたい場合や急に変化すると違和感がある処理を一定の時間かけて処理させる場合などに使えるというわけです。
コルーチンを使用するための書き方
コルーチンのスクリプトですが、IEnumeratorの関数でコルーチンの内容を作成し、StartCoroutineメソッドで実行します。
実際にコルーチンを使用したスクリプトは以下になります。
yieldとStartCoroutineがポイントになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using UnityEngine; using System.Collections; public class CoroutineTest : MonoBehaviour { void Start() { StartCoroutine("Corou1"); } //コルーチン関数を定義 private IEnumerator Corou1() //コルーチン関数の名前 { //コルーチンの内容 Debug.Log("スタート"); yield return new WaitForSeconds(5.0f); Debug.Log("スタートから5秒後"); } } |
このスクリプトの結果が下になります。確かに5秒後に処理が行われていることが分かります。
コルーチンの内容についてこれから説明していきます。
処理を一時停止(中断・再開)させる:yield return new WaitForSeconds(秒);
処理を途中で中断して、一定時間経つと次の行から処理が再開されるスクリプトの書き方を説明します。
この方法ははじめのスクリプト例で使っているものになり、秒数で指定する書き方です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using UnityEngine; using System.Collections; public class CoroutineTest : MonoBehavior { void Start() { StartCoroutine("Corou2"); } //コルーチン関数を定義 private IEnumerator Corou2() //コルーチン関数の名前 { //コルーチンの内容 Debug.Log("スタート"); yield return new WaitForSeconds(2.0f); Debug.Log("スタートから2秒後"); yield return new WaitForSeconds(8.0f); Debug.Log("スタートから10秒後"); } } |
上のように
<処理A>ー<a秒間中断する>ー<処理B>-<b秒間中断する>-<処理C>ー・・・
とコルーチンを同じスクリプトの中で何度も使用することもできます。
1フレーム待機させる:yield return null;
1フレーム待機させて次の処理をさせたい場合はyield teturn nullを使います。
1フレームごとに画像のアルファの値を変化させて、徐々にフェードアウトさせることに使われたりします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using UnityEngine; using System.Collections; public class CoroutineTest : MonoBehaviour { void Start() { StartCoroutine("Corou3"); } //コルーチン関数を定義 private IEnumerator Corou3() //コルーチン関数の名前 { //コルーチンの内容 Debug.Log("a"); yield return null; Debug.Log("b"); } } |
コルーチンを停止・破棄する:yield break;
ループなどが含まれたコルーチンでは、決めた回数や時間でコルーチンを終了したい場合も出てきます。
その場合、コルーチンを終了するにはyield breakを使います。
下のスクリプトは毎秒ログを吐き出し、5秒経ったらコルーチンが終了するというスクリプトになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using UnityEngine; using System.Collections; public class CoroutineTest : MonoBehaviour { void Start() { StartCoroutine("Corou4"); Debug.Log("コルーチンを実施中です"); } //コルーチン関数を定義 private IEnumerator Corou4() //コルーチン関数の名前 { //コルーチンの内容 for (int i = 1 ; i < 6 ; i++ ) { Debug.Log("今" + i + "秒です"); yield return new WaitForSeconds(1.0f); if (i == 5) { Debug.Log("コルーチンを終了しました"); yield break; } } } } |
さて、結果を見ると「コルーチンを実施中です」というログが「今1秒です」と「今2秒です」の間にあることが分かります。
ここにコルーチンの疑似的並列処理という特徴が出ています。
まずStartCoroutineでfor文の1回目の処理を行っているのですが、「今1秒です」というログを吐き出した後に1秒待つという処理があります。
この待ち時間にStart関数の中の「コルーチンを実施中です」というログが吐き出されているのです。
このようにコルーチンを上手く使うと複数の処理を並列で処理させることもできます。
コルーチンを呼び出す:StartCoroutine
先述の通りコルーチンはStartCoroutineで呼び出して実行します。
StartCoroutineには引数に値を渡すこともできます。
1 2 3 4 |
//引数に値を渡す StartCoroutine("Corou5" ,引数に渡す値); //2つ以上の引数に値を渡す(例は3つの引数の場合) StartCoroutine(Corou6(値1,値2,値3)); |
コルーチンの中で別のコルーチンを呼び出す
コルーチンの中で別のコルーチンを呼び出すこともできます。
何度も同じコルーチンを書く必要が無くなります。
1 2 |
//「OtherCoru」という別のコルーチンを呼び出す yield return StartCoroutine("OtherCoru"); |
まとめ
いかがでしたでしょうか。
コルーチンを使うことで処理の一時中断・再開だけでなく、疑似的な並列処理も実現することができ、ゲームの幅を大きく広げることができると思います。
この機会にしっかりとコルーチンについての理解を深め、ゲームで効率よく使用できるようになれれば幸いです。
Unityに関してもっと学びたい方は是非こちらをご覧ください。
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!