ロバメモ - 素人のUnity覚書と奮闘記

素人のUnity覚書と奮闘記

コルーチンでTime.timeScaleを使ってはまったこと

問題点

再生速度を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;
            }
        }
    }
}

以上。