这只是我的代码的一部分,我希望它将很容易理解。我找到了一种“修复”它的方法,但是我仍然不明白这一点:
我将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();
}
}
首先,我看不到您最初将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
调用方法,而是可以调用一次并让其运行。由于循环仅限于方法本身,因此您可以使用DisplayTime
将countDownTime
的初始值设置为2。