LoginSignup
16

More than 5 years have passed since last update.

StopCoroutineではコルーチンは完全に止まらない

Posted at

Unity(C#)でコルーチンを使うことがあるが、
変な動きをする部分があったので検証したら
コルーチンのせいだった。

テストで書いてみないと原因わからない感じだったので一応記載

意図したとおりに動いていなかったコード

Hoge.cs
using UnityEngine;
using System.Collections;

public class hoge : MonoBehaviour {
    IEnumerator routine;
    // Use this for initialization
    void Start () {
        routine = coroutine();
        StartCoroutine(routine);
    }

    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.X))
        {
            StopCoroutine(routine);
           StartCoroutine(routine);
        }
    }

    IEnumerator coroutine()
    {
        Debug.Log("start");
        yield return new WaitForSeconds(1f);
        Debug.Log("1s");
        yield return new WaitForSeconds(1f);
        Debug.Log("2s");
        yield return new WaitForSeconds(1f);
        Debug.Log("3s");
        yield return new WaitForSeconds(1f);
        Debug.Log("4s");
        yield return new WaitForSeconds(1f);
        Debug.Log("5s");
        yield return new WaitForSeconds(1f);
    }
}

こういう感じで書いて、途中でXキー押すと

start
1s
2s
start
1s
2s
3s
4s
5s

という挙動をするのだと思いこんでいた。
だけどこの書き方だとコルーチンは完全に止まったわけじゃなく
スタートするともう一度止まった次の部分から開始するらしいことがわかった。

解決策として

if (Input.GetKeyDown(KeyCode.X))
{
    StopCoroutine(routine);
    routine = null;
    routine = coroutine();
    StartCoroutine(routine);
}

1回null入れると完全に死んでもういっかい最初からになった。

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
16