LoginSignup
41
39

More than 5 years have passed since last update.

コルーチンの初歩的な使い方【Unity, 初心者】

Last updated at Posted at 2015-08-07

コルーチンの初歩的な使い方

コルーチンは処理の開始や停止を別スレッドのようなふるまいでコントロールすることができます。
シーケンシャルなUIの時とかにすごく使えます。

毎フレーム処理

毎フレーム処理を開始します。
yield return のところで

void Start () {
    // コルーチンを設定
    StartCoroutine(loop());
}

private IEnumerator loop() {
    // ループ
    while (true) {
        // 毎フレームループします
        yield return null;
        Debug.Log("loop");
    }
}

指定のフレーム分だけ処理

10フレームだけ処理を行います。

void Start () {
    // コルーチンを設定
    StartCoroutine(loop(10));
}

private IEnumerator loop(int frame) {
    // ループ
    while (frame > 0) {
        // frameで指定したフレームだけループします
        yield return null;
        Debug.Log("loop");
        frame--;
    }
}

秒数指定

yield return のところをWaitForSecondsにします。

void Start () {
    // コルーチンを設定
    StartCoroutine(loop(10f));
}

private IEnumerator loop(float second) {
    // ループ
    while (true) {
        // secondで指定した秒数ループします
        yield return WaitForSeconds(second);
        Debug.Log("loop");
    }
}

yield returnの挙動

yield returnのたびに処理が中断して次のフレームまで待つみたいです。
下のサンプルではUpdate内でマイフレーム"update------"を出力していて、コルーチンではyield returnの度に文字列を出力しています。

void Start () {
    StartCoroutine (loop ());
}

void Update () {
    Debug.Log ("update------");
}

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

yield returnのたびにそのフレームの処理が止まって次のフレームまで待ってます。
updateが最初重なってしまうのはどうしてだろうか。
yield returnとDebug.Logの順番を逆にしたら今度はloop0のあとに2回updateが来てしまいました。

update------
update------
loop0
update------
loop1
update------
loop2
update------
loop3
update------
loop4
41
39
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
39