StartCoroutine、WaitForSeconds、そしてyield

MonoBehaviourの機能として提供されているStartCoroutineをちょっとだけ触ったので忘れないようにメモメモ。

logの1は即座に表示され、
logの2は3秒待ったあとに表示され、
logのisFlgは5秒待ったあとに表示される。

ここで、logの2とlogのisFlgのwaitTimeがもし両方とも3秒の場合は、一気に表示される。
つまりその前のコルーチンのwaitをその下に書いたコルーチンは引きづられない。

サンプルコード

using UnityEngine;
using System;
using System.Collections;

public class Coroutine : MonoBehaviour {
  // Use this for initialization
  void Start () {
    Debug.Log(1);

    StartCoroutine(wait());

    StartCoroutine(waitForCallback(5f, (bool isFlg) => {
      Debug.Log(isFlg);
    }));
  }

  // Update is called once per frame
  void Update () {
  }

  IEnumerator wait() {
    yield return new WaitForSeconds(3f);
    Debug.Log(2);
  }

  IEnumerator waitForCallback(float waitTime, Action<bool> callback) {
    yield return new WaitForSeconds(waitTime);
    callback(true);
  }
}

なかなか面白いね。
これよく見るサンプルではStartメソッドの中に書かれているけど、Updateメソッドの中で書く場合は、
フラグとかもたして、間引く?必要があるのかな。
じゃないと、フレームごとにUpdateメソッドが呼ばれて、キューにコルーチンが溜まりまくってしまいそう。
そもそもそんなタイミングで使わないのかな。

こうゆうの作っておけば便利なのかな

using UnityEngine;
using System;
using System.Collections;

public class Callback {
  public static IEnumerator waitForCallback(float waitTime, Action callback) {
    yield return new WaitForSeconds(waitTime);
    callback();
  }
}

gist

Callback.cs

参考リンク

Unity4入門   最新開発環境による簡単3Dゲーム製作
浅野 祐一 荒川 巧也 森 信虎
ソフトバンククリエイティブ
売り上げランキング: 4,554

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>