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