こんにちは、ひっしーです。
今回は、ゲーム開発エンジンUnityを使用してゲーム開発を行った際にこの機能はかなり便利だなと思ったコルーチンの処理について、実用例も交えて解説したい思います。
今回の目次です。
コルーチンとは、処理を中断し任意のタイミングで中断したところから処理を再開できる機能のことです。
フレーム毎に処理を中断することができるので、
数秒後に何かをしたいときや数秒間隔で処理を行いたいという動きを実現することができます。
上記の説明だけではイメージが付きにくいと思いますので、実際に使用方法についてみていきましょう。
コルーチンを使うには、コルーチンの処理を宣言する必要があります。
イメージとしては、メソッドを宣言して使用する方法に似ているかと思います。
以下の様に宣言していきます。
//IEnumeratorはコルーチンであるという宣言
IEnumerator コルーチン関数名()
{
//処理1
yield return new WaitForSeconds(止めたい秒数);
//処理2
}
上記の様に書いた場合、コルーチンが呼ばれるとまず処理1が行われます。
処理1が終わったら[yield return new WaitForSeconds(止めたい秒数);]で指定した秒数の間処理を中断します。
指定した秒数が経過したら処理2を実行します。
このように、通常はコードの実行は、行が分かれていてもすべて1フレームの間に実行されてしまいますがコルーチンを使用したコードでは処理と処理に間隔を持たせることができるので遅らせて実行できます。
次にコルーチンの実行の仕方です。
先ほどのようなコルーチンをクラス内に宣言したら、呼び出したいタイミングで以下の様に書きます。
StartCoroutine("コルーチン関数名");
このようにStartCoroutineに先ほど指定したコルーチンの関数名を文字列として指定するだけで実行できます。
これで、コルーチンの開始方法はわかりました。
次はコルーチンの止め方についてです。
コルーチンは、一度実行すると最初に宣言した処理を完了するまで実行し続けます。
そのため、ゲームの中で攻撃ボタンを押したら3秒後に攻撃が出る設定にしていた時に攻撃ボタンを押して攻撃が出るまでの3秒間でプレイヤーが負けになりゲームオーバーになっても関係なく3秒後に攻撃が出現してしまいます。
そのようなことが起こらないようにこれ以上コルーチンの処理をさせたくないというときはコルーチンを止める必要があります。
コルーチンを止める際は以下の様に書きます。
StopCoroutine("コルーチン関数名");//指定のコルーチンを止めたいとき
StopAllCoroutines();//すべてのコルーチンを止めたいとき
こちらもスタートと同じようにStopCoroutineを使用すれば止めることができます。
全てのコルーチンを止めたいときはStopAllCoroutinesを使用することで止めることができます。
また、コルーチンの中でコルーチンの処理を停止したいときには、以下の様に書きます。
IEnumerator Break()
{
for(int i=1; i<=5; i++){ //for文で5回処理を行う
Debug.log(i+"回目");
if(i=3){ //iが3になった時に実行
Debug.log("コルーチンを終了");
yield break; //コルーチンの処理を終了して抜ける
}
yield return new WaitForSeconds(1.0f);
}
}
上記のyield breakを使用することでコルーチンの処理の外からStopCoroutineで止めてあげなくても、コルーチン処理の中で条件に応じて処理を終了することができます。
ここまでで使い方についてはわかったかと思いますので、次は実用例を紹介します。
実際に私が使用した際のコードが以下の様になります。
void Start()
{
StartCoroutine("shoot");//shootのコルーチンを開始している
}
IEnumerator shoot()
{
foreach (GameObject obj in balls)//あらかじめ用意していた配列の数だけ実行
{
obj.GetComponent<Ball>().setForce();//配列のゲームオブジェクトに力を加えるメソッドを実行
yield return new WaitForSeconds(waitSec);//waitSecで指定した秒数だけ処理を中断
//waitSecで指定した秒数が経ったら処理を再開、foreachの初めから行うを繰り返す
}
}
こちらの処理は、球に断続的に力を加えて連なるような動きを実現する必要があったので実装しました。
このように、連続したfor文の処理でもfor文の最後にyield return new WaitForSeconds(秒数)を指定することでfor文の処理を遅らせることができます。
ここまで紹介した方法は秒数を指定して指定した秒数で処理を中断する方法でした。
ですが、1フレームだけ中断したい場合には以下の様に書きます。
//IEnumeratorはコルーチンであるという宣言
IEnumerator コルーチン関数名()
{
//処理1
yield return null;
//処理2
}
このように書くことで秒数ではなくフレーム単位で中断させて処理することが可能です。
こちらも便利ですので使用してみていただければと思います。
その他にも、時間を遅らせて処理を実行したいときにとても便利に使うことのできる機能ですのでいろいろと使い方を考えて使用してみてください。
今回はコルーチンについて解説しました、内容をまとめると以下になります。
いろいろと注意点はあるもののとても簡単に使える機能で汎用性も高いです。
しっかりと仕組みを理解して使えば簡単にいろいろな処理を実現できるようになると思います。
本記事でコルーチンについて理解が少しでも進んでいただければ幸いです。
みなさんも機会がありましたら是非ご活用ください。