unity3d - 我想知道为什么我的倒数计时器就像我将要描述的那样
问题描述
这只是我的代码的一部分,我希望很容易理解。我找到了一种“修复”它的方法,但我仍然不明白这一点:
我将浮动 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();
}
}
解决方案
你需要考虑2个因素。
Update()
在每一帧上调用方法。您正在执行DisplayTime(
从 Update() 调用的 do-while 循环,因此 do while 循环将执行很多次(每帧一次)。- do-while 循环的工作方式与正常的 while 循环不同。do-while 循环首先执行 do{} 内的代码,并且仅在检查条件后才执行,如果条件为假则中断循环。所以(即使条件为假)do{} 中的代码将至少运行一次。在正常情况下,如果条件为假,则循环内的代码将不会运行。
因此,在您的情况下,订阅第一帧countDownTime
直到它小于 0。(所以在屏幕上您会立即看到 0 而不是 2,因为在第一帧之后它已经是 0)。在执行 do-while 的每一帧的第一帧之后,do 内的代码只执行一次,然后循环立即中断,因为条件countDownTime
>= 已经为假。因此,在第一帧之后,countDownTime -= Time.deltaTime;
此代码每帧执行一次(在 do-while 中不循环多次),这就是它之后“正确”工作的原因。
推荐阅读
- android - 声明 CheckBoxPreference 时不成功的强制转换
- c++ - Flatbuffers 创建枚举向量
- sql - 查询以查找自连续观察列的最后一个值以来的天数 - PostgreSQL
- php - 在 Woocommerce 感谢页面上添加产品缩略图
- google-bigquery - BigQuery 在重复字段上连接表
- pdf - 如何使用 Ghostscript 对 pdf 文档进行每页更改?
- office365 - 如何在 SharePoint 中使用 Jquery 获取 Web 对象?
- c# - 如果应用程序由于未处理的异常或其他原因崩溃,FileStream 会发生什么?
- python - 将列表对象缩短为仅数字并在 Python 中创建新列表
- hibernate - Hibernate 提取错误数据类型的值