問題点
再生速度をTime.timeScaleを使って変更しているため、コルーチン内で下記のような処理をしていたら、Time.timeScale=0のときにWaitForSeconds()に入るとTime.timeScale=1に戻ってもコルーチンが再開されなかった。
float walk_speed = 0.1f; IEnumerator WalkAnimation() { while (mode == "walk") { var speed = walk_speed * 1 / Time.timeScale; yield return new WaitForSeconds(speed); } }
原因
原因は、こちらのブログに書かれてました。
【Unity】Time.timescale に依存しない WaitForSeconds - コガネブログ
WaitForSeconds は Time.timescale に依存するため
Time.timescale に 0 が代入されていると
WaitForSeconds が完了することはありません
0秒待つだから一切待たないのかと思いきや、停止したようになってしまうのね。
回避方法
正しいのかわからないけど、下記の方法で回避できたっぽい。
Time.timeScale>0じゃなければWaitForSeconds()を実行して、0以下のときは何もしないて待機するようにした。
※修正後 ご指摘いただきましたので、修正します。(2019/12/29)
IEnumerator IdleAnimation() { while (mode == "walk") { while (Time.timeScale <= 0) { yield return null; } var speed = walk_speed * 1 / Time.timeScale; yield return new WaitForSeconds(speed); } }
※修正前
IEnumerator IdleAnimation() { while (mode == "walk") { var speed = walk_speed * 1 / Time.timeScale; if (Time.timeScale > 0) { yield return new WaitForSeconds(speed); } else { while (Time.timeScale <= 0) { yield return null; } } } }
以上。