【Unity】Coroutine(コルーチン)で一定時間処理を待つ!【ひよこエッセンス】
Unity5.0.0f4 Personal(2015年5月)
ひよこエッセンスの時間です〜
今回は一定時間処理を待つコルーチンについて解説していきます〜
コルーチンで一定時間処理を待つ
①Startメソッドでコルーチン
まずはStartメソッドでコルーチンを使ってみましょう〜その前に、コルーチンを使って生成するCubeのPrefabを先に作っておきましょう〜
Prefabの作り方は以下エッセンスをご参照下さい〜
続いてCubePrefabにmoveScriptを取り付けます〜これは、Cubeがただ右から左へ流れていくだけのスクリプトです〜
続いてCubeを生成するFieldManagerというGameObjectを作成します〜xのポジションだけ10にしておいて下さい〜
CreateEmptyで空ゲームオブジェクト作成
position.xだけ10にしておく
それではこのFieldManagerオブジェクトにcoroutineScriptという、コルーチンを使ったCube生成スクリプトを取り付けていきます〜以下ソースです!
まずはpublic変数objに先ほど作成したCubePrefabを指定します〜
ドラッグ&ドロップ!
コルーチンは戻り値をIEnumeratorとすることで実装することができます〜
Startメソッドの戻り値をIEnumeratorにし、Startメソッドの中を無限ループしています〜
無限ループの中の処理は、InstantiateでCubeを生成し、WaitForSecondsメソッドによって1秒待機し、待機後に無限ループの先頭に戻っています〜これにより1秒間隔でCubeを生成する処理を実現しています〜
1秒に1つCubeを作り、左から右へ流す
WaitForSecondsメソッドを実装できるのはコルーチン内のみ、つまり戻り値がIEnumeratorであるメソッド内でのみなので、ご注意下さい〜
また、間隔の空け方には
コルーチン内で1フレームだけ待つ:yield return null;
コルーチン内でコルーチンを終了する:yield break;
という方法もありますので、ご活用下さい〜
②別のメソッドからコルーチン呼出
外部からコルーチンを呼び出すこともできます〜というか、こっちのほうが多いかと思います〜
それでは先ほどのcoroutineScriptを修正しましょう〜以下ソースです!
Startメソッド内でStartCoroutineというメソッドを実行しています〜引数に文字列"CreateCube"を指定して使うことで、CreateCubeメソッドを呼び出しています〜
もうひとつ別な形として、メソッドをそのまま指定する方法もあります〜
どちらにせよコルーチン、つまりIEnumeratorという戻り値があるメソッドは、StartCoroutineで呼び出す必要があることを覚えておいて下さい〜
CreateCubeメソッド内は、先ほどのStartメソッド内と同じです〜
③コルーチンに引数を指定する
コルーチンに引数を指定して使いたい場合、StartCoroutineの引数を文字列ではなくメソッドで指定する、もしくは("メソッド", 引数)の形で指定する必要があります〜以下に例をあげます〜
引数を文字列"CreateCube"ではなく、メソッドCreateCube( )を指定して、引数3.0fを指定しています〜
この引数を受け取りposition.yを0〜3のランダムとした結果は・・・
きちんと引数を受け取り、ランダムでCubeを生成しています〜ランダムな足場を作成したい時等に使えそうですね〜
④コルーチンを止める
StartCoroutineメソッドとセットで覚えてほしいのがStopCoroutineです〜その名の通り、コルーチン処理を途中でストップさせることができます〜
このStopCoroutineを使う際に注意して頂きたいのは、文字列指定で呼び出されたコルーチンに対してしか機能しないということです〜例をあげてみます〜
Startメソッドにて文字列"CreateCube"を引数に指定したStartCoroutineを実行し、Cubeを1秒間隔で生成しています〜そして、Updateメソッドにてスペースキーを押した時にStopCoroutineが機能し、コルーチンをストップさせることができます〜
文字列指定で呼び出されたコルーチンに対してしか機能しないので、引数付きのコルーチンに対してStopCoroutineを使いたい時は、StartCoroutine(CreateCube( 引数 ))ではなく、StartCoroutine("CreateCube", 引数)の形を使って下さい〜
⑤複数の引数を持つコルーチンをストップさせる
StartCoroutineで呼びだすメソッドの引数は、メソッド名を指定すればもちろん複数指定することもできます〜例えば、 StartCoroutine(CreateCube(-3.0f, 3.0f)) という形です〜
しかしこの形だと引数にメソッドを使っているため、StopCoroutineで止めることができません〜そうした時の回避方法を以下に載せます〜
まずはIEnumerator型の変数createCubeを作っておき、StartメソッドにてCreateCubeメソッドを引数付きで指定します〜
その後、先ほど指定した変数をStartCoroutineの引数にしていし、複数の変数を使いコルーチンを実行しています〜
指定したのはメソッド名ではなく変数名なので、StopCoroutineがきちんと機能するというわけです〜
⑥全てのコルーチンを同時に止める
最後になりますが、
StopAllCoroutines( );
というメソッドを使うと、実行中のコルーチンを全て止めることができます〜
以上、ひよこエッセンスでした〜
ありがとうございました〜