読者です 読者をやめる 読者になる 読者になる

デジタルフロッグ

Unityのアプリの開発をしながらいろいろと忘れないための備忘録でございます。

コルーチン yield return nullについて yield return new WaitForSeconds(float)も;

最初にスクリプトをバンっと貼っておきます。

using UnityEngine;
using System.Collections;

public class hogehoge : MonoBehaviour {

    // Use this for initialization
    void Start () {
        StartCoroutine("cor");
    }

    // Update is called once per frame
    void Update () {
        Debug.Log ("アプデ");
    }

    private IEnumerator cor(){
        for (int i = 0; i < 5; i++) {
            Debug.Log (i);
            yield return null;
        }
    }
}

 

それでは見ていきましょう。コルーチンの動きを見てみようと思いますが、このスクリプトだとStartでまず最初にコルーチンに向かいます。

yield return null;

こいつが入ると一度中断して次のフレームで再度再会するようになります。

どういう風になっているかコンソールを見てみましょう。

f:id:karaagedigital:20160905143128p:plain

forに入ってそのままぐるぐるーっとiが5になるまで回らずにコルーチンの中のforの処理を1周したらアップデートの中を一周して、またコルーチンの中の処理をして、アップデートの処理をして…と1フレーム挟まれている事がわかります。

    private IEnumerator cor(){
        for (int i = 0; i < 5; i++) {
            Debug.Log (i);
        }
        yield return null;

    }

ためしにyield return nullをforの外に出してみましょう。

f:id:karaagedigital:20160905143417p:plain

先にforの中の処理をして、yield return nullに到達した時点でアップデートに戻ります。そして再会されてコルーチンの処理は終わりを迎えます。

永久にループしたいっていう場合はwhile(true)などを使って永久ループを作ってしまってもいいと思います。

 

ちなみにyield return nullだと1フレーム事に中断されますが、これを秒数で指定したい場合はどう書けばいいのかというと

 

yield return new WaitForSeconds (float);

 

float型で秒数を指定するとその秒数が経過したらするまで次の処理に移りません。

f:id:karaagedigital:20160905144359p:plain

コンソールで見てみるとこんな感じです。間は長いので割愛しています。

ちなみに引数を下記のようにすると渡す事も出来ます。

 

StartCoroutine(コルーチン名, 引数に渡す値);

 

スクリプトです。

 

using UnityEngine;
using System.Collections;

public class hogehoge : MonoBehaviour {

    // Use this for initialization
    void Start () {
        StartCoroutine("cor",1.0f);
    }

    // Update is called once per frame
    void Update () {
        Debug.Log ("アプデ");
    }

    private IEnumerator cor(float second){
        for (int i = 0; i < 5; i++) {
            Debug.Log (i);
            yield return new WaitForSeconds(second);
        }
    }
}

 

これで動かしてもyield return new WaitForSeconds(1.0f);の時と同じです。

コルーチンを使うと●秒待つ→動く→●秒待つ→動くなどの時間を絡めた作業をする事に向いているようです。

これを覚えていれば色々と使えそうなのでぜひ覚えておきたいですね。