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

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

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

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( );

 

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

 

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

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