Posted at

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

More than 3 years have passed since last update.

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入れると完全に死んでもういっかい最初からになった。