我想知道我的倒数计时器为何如我所描述。 (统一)

问题描述 投票:0回答:1

这只是我的代码的一部分,我希望它将很容易理解。我找到了一种“修复”它的方法,但是我仍然不明白这一点:

我将float countDownTime设置为2f。在DisplayTime()中,我认为do-while循环将从2倒数到0,但是开始从0倒数到负数。我以为它会倒计数并在countDownTime达到0时停止,如while(countDownTime> = 0)中分配的那样。感谢您的任何反馈或帮助。

   // Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && !hasStarted)
    {
        hasStarted = true;
        StartGame();            
    }

    DisplayTime();        
}

void DisplayTime()
{        
    if (timerStart)
    {
        do
        {
            countDownTime -= Time.deltaTime;
        } while (countDownTime >= 0);

        timer2.text = Math.Round(countDownTime, 2).ToString();
    }        

}

我对其进行了更改,这是我的解决方法:

   // Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && !hasStarted)
    {
        hasStarted = true;
        StartGame();            
    }

    DisplayTime();        
}

void DisplayTime()
{        
    if (timerStart && countDownTime >= 0)
    {
        do
        {
            countDownTime -= Time.deltaTime;
        } while (countDownTime >= 2);

        timer2.text = Math.Round(countDownTime, 2).ToString();
    }        

}
unity3d timer do-while countdown
1个回答
0
投票

首先,我看不到您最初将countDownTime设置为2的位置。

其次,countDownTime很有可能不止于负数而不是零。这是因为deltaTime是自上次更新以来经过的ms的量度,并且变化很大。因此,如果您不希望显示为负数,则应将其取整为0。

最后,我认为您想以协同程序的形式执行此代码,否则整个循环将在单个帧中执行,这很可能不是您想要的。

IEnumerator DisplayTime() {  
     countDownTime = 2;
     while (countDownTime > 0) {
         countDownTime -= Time.deltaTime;
         timer2.text = Math.Round(countDownTime, 2).ToString();
         yield return new WaitForEndOfFrame();
     }
}

void Start() {
    // start coroutine
    StartCoroutine(DisplayTime);
}

如果您不希望使用协程,并且想在Update方法的每一帧中对其进行调用,则只需删除while循环。

void DisplayTime() {        
    if (timerStart) {
        if (countDownTime > 0) {
            countDownTime -= Time.deltaTime;
        }
    }
    timer2.text = Math.Round(countDownTime, 2).ToString();
}

协程方法的好处是通常更易于管理。您不必一次从Update调用方法,而是可以调用一次并让其运行。由于循环仅限于方法本身,因此您可以使用DisplayTimecountDownTime的初始值设置为2。

© www.soinside.com 2019 - 2024. All rights reserved.