unity3d 如何在Unity C#中使用协程制作定时器

r7knjye2  于 2023-05-01  发布在  C#
关注(0)|答案(2)|浏览(223)

我试图使2分钟的计时器为我的游戏使用协程。它开始从游戏的biginning倒计时。一切都很好,直到达到1分钟。在那之后,有些东西出错了(我认为错误是在yield命令中,因为当我调试代码时,它抛出了那一行)。

错误:

有一个链接与链接到GIF显示错误:https://giphy.com/gifs/Pk8t1StrR8dmip30NN

private int seconds;
private int minutes = 1;

void Start()
{
    seconds = 59;
    timer.text = "2:00";
    StartCoroutine(CountSeconds());
}

IEnumerator CountSeconds() 
{
    while (true)
    {

        seconds--;

        if (seconds >= 10)
        {
            timer.text = $"{minutes} : {seconds}";
        }
        else 
        {
            timer.text = $"{minutes} : 0{seconds}";

            if (seconds == 0)
            {
                seconds = 59;
                minutes--;
            }
        }

        yield return new WaitForSeconds(1f);
    }
}

}
请帮我解决这个荒谬的问题。

y53ybaqx

y53ybaqx1#

我会采取一种不同的方法,使用TimeSpan来倒计时分钟,因为这会让一切变得更容易。

private TimeSpan timeLeft = new TimeSpan(0, 2, 0);

void Start()
{
    timer.text = timeLeft.ToString("mm\:ss");
    StartCoroutine(CountSeconds());
}

IEnumerator CountSeconds() 
{
    while (true)
    {
        //I am reducing the time left on the counter by 1 second each time.
        timeLeft = timeLeft.Subtract(new TimeSpan(0, 0, 1));
        timer.text = timeLeft.ToString("mm\:ss");

        yield return new WaitForSeconds(1f);
    }
}
u7up0aaq

u7up0aaq2#

检查你的文本,它可以显示0:59或0:58?或者确保你有其他逻辑使用文本,看起来像当secnodes == 0然后设置为59,但下一个循环它--设置为58,0:59已经跳转。你可以在开始记录时使用var startime = Time。time;当你需要seconds--时,使用senconds -(Time.time - startTime);

相关问题