Во-первых, я не вижу, где вы изначально устанавливаете countDownTime
на 2.
Во-вторых, countDownTime
скорее остановится на отрицательном числе, чем на нуле.Это связано с тем, что deltaTime
является мерой количества мс, прошедших с момента последнего обновления, и сильно варьируется.Поэтому вы должны округлить его обратно до 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();
}
Преимущество метода Coroutine заключается в том, что им обычно легче управлять.Вместо того, чтобы вызывать метод каждый раз из Update
, вы можете вызвать его один раз и просто запустить.Поскольку зацикливание ограничивается самим методом, вы можете использовать DisplayTime
для установки начального значения countDownTime
в 2.