Unity5(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity】Coroutine(コルーチン)で一定時間処理を待つ!【ひよこエッセンス】

いつもひよこのたまごをご利用下さいましてありがとうございます!
おかげ様でチュートリアル数も10ゲーム目となりました!
チュートリアル一覧は
こちら からどうぞ!


スポンサーリンク

Unity5.0.0f4 Personal(2015年5月)

 

f:id:hiyotama:20150504205926p:plain

 

ひよこエッセンスの時間です〜

今回は一定時間処理を待つコルーチンについて解説していきます〜

 

コルーチンで一定時間処理を待つ

 

①Startメソッドでコルーチン

まずはStartメソッドでコルーチンを使ってみましょう〜その前に、コルーチンを使って生成するCubeのPrefabを先に作っておきましょう〜

Prefabの作り方は以下エッセンスをご参照下さい〜

 

 

続いてCubePrefabにmoveScriptを取り付けます〜これは、Cubeがただ右から左へ流れていくだけのスクリプトです〜

 

 

続いてCubeを生成するFieldManagerというGameObjectを作成します〜xのポジションだけ10にしておいて下さい〜

 

f:id:hiyotama:20150525104733p:plain

CreateEmptyで空ゲームオブジェクト作成

 

f:id:hiyotama:20150525110524p:plain

position.xだけ10にしておく

 

それではこのFieldManagerオブジェクトにcoroutineScriptという、コルーチンを使ったCube生成スクリプトを取り付けていきます〜以下ソースです!

 

 

まずはpublic変数objに先ほど作成したCubePrefabを指定します〜

 

f:id:hiyotama:20150525110620p:plain

ドラッグ&ドロップ!

 

コルーチンは戻り値をIEnumeratorとすることで実装することができます〜

 

Startメソッドの戻り値をIEnumeratorにし、Startメソッドの中を無限ループしています〜

 

無限ループの中の処理は、InstantiateでCubeを生成し、WaitForSecondsメソッドによって1秒待機し、待機後に無限ループの先頭に戻っています〜これにより1秒間隔でCubeを生成する処理を実現しています〜

 

f:id:hiyotama:20150525111004p:plain

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のランダムとした結果は・・・

 

f:id:hiyotama:20150525113507p:plain

 

きちんと引数を受け取り、ランダムで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( );

 

というメソッドを使うと、実行中のコルーチンを全て止めることができます〜

 

以上、ひよこエッセンスでした〜

ありがとうございました〜