起こったこと
コルーチンの中でwhile使って、WaitForSecondsで数秒ごとにループさせていたのですが、任意のタイミングでそのコルーチンから抜け出したくなって、StopCoroutineを使って別のコルーチンを呼び出したら、中断したはずのコルーチンの中の処理が数回勝手に呼び出されるという問題が発生しました。。。
目次
- 原因
- 対策
1. 原因(僕の場合)
1-1.連続で処理命令してしまって処理が溜まってしまった可能性
コルーチンの中にwhile文を入れてWaitForSeconds使ってループさせていた。
とあるモデルのアニメーションが終わるまで、6秒ほどかかる。(Unity側でアニメーションの速度を遅くしたから)しかし、WaitForSecondsで止めていた秒数は3秒。
となると、アニメーションは6秒ごとに再生されているが、アニメーション再生命令は3秒ごとにしてしまっていたので、処理が溜まってしまって、後から処理されてしまったのではないだろうか。。。
1-2. そもそもStopCoroutineって本当に止まっているのか
アニメーションの命令が溜まってしまってもStopCoroutineしたら強制的に中断されるのかと思ったらそうではなかった。
だとしたら、Unity側のバグなのかなぁ、、、
修正したこと
やはり原因1-1の部分が怪しいって思って、while文を使うのをやめて、アニメーションイベントを使ってアニメーションの最後のタイミングでまたStartCoroutine使うことでループさせるようにしたら、勝手に再生されることはなくなった。
また、StopCoroutineしても止まらなかった場合、StopCoroutineした後に、何の機能も持たせない仮のコルーチンを呼び出したら無事に前のコルーチンが終了できた。
IEnumerator HogeHoge(){
var wait = new WaitForSeconds (5);
yield return wait;
}
感想
while文使ってWaitForSecondsを長くしたら処理がたまるはずがないが、長くしても勝手に処理されてしまう。。。
whileをやめたループの仕方をすれば完全にバグがなくなったので、コルーチンのなかにwhileを使うこと自体がバグの原因になってしまうのだろうか。。。ここだけは謎です。
処理が溜まって後からそれがどんどん実行されるっていうのが初めてで気づくまでに時間がかかってしまいましたが、それに気づけてよかった。。。笑