Я столкнулся с небольшой проблемой при использовании C#/Unity в сочетании с небольшим таймером обратного отсчета. Обратный отсчет работает нормально, как и ожидалось, если общее количество timeToDisplay не слишком велико (например, более дня)
r/Unity2D - Обращение за помощью: Обратный отсчет странным образом останавливается, когда остается слишком много времени Как видите, у пользователя есть возможность добавить время к этому обратному отсчету, который (опять же) работает нормально, пока не станет слишком много.
Использование TextMeshPro и TextMeshPro-Buttons.
Изображение обратного отсчета + кнопки для добавления секунд/минут/часов/дней
Однако... вот код:
using UnityEngine;
using TMPro;
public class Controller : MonoBehaviour
{
public float timeValue = 78000;
public TMP_Text timerText;
// I also tried FixedUpdate, but error still occured
void Update()
{
if (timeValue > 0)
{
timeValue -= Time.deltaTime;
}
else
{
timeValue = 0;
}
DisplayTime(timeValue);
}
void DisplayTime(float timeToDisplay)
{
float days = Mathf.FloorToInt(timeToDisplay / 86400);
timeToDisplay = timeToDisplay % 86400;
float hours = Mathf.FloorToInt(timeToDisplay / 3600);
timeToDisplay = timeToDisplay % 3600;
float minutes = Mathf.FloorToInt(timeToDisplay / 60);
timeToDisplay = timeToDisplay % 60;
float seconds = Mathf.FloorToInt(timeToDisplay);
if (seconds < 0)
{
seconds = 0;
}
timerText.text = string.Format("{0:00} days {1:00} hours {2:00} minutes {3:00} seconds", days, hours, minutes, seconds);
}
public void AddDay()
{
/* 86400 seconds/day */
timeValue += 86400;
}
public void AddHour()
{
/* 3600 seconds/hour */
timeValue += 3600;
}
public void AddMinute()
{
timeValue += 60;
}
public void AddSecond()
{
timeValue += 1;
}
}
Кто-нибудь знает, что мне здесь не хватает?
проблема здесь: timeValue -= Time.deltaTime
, поплавок имеет небольшое отклонение
public float timeValue = 78000;
float beginTime = 0;
void Start()
{
beginTime = Time.time;
}
// I also tried FixedUpdate, but error still occured
void Update()
{
float usedTime = Time.time - beginTime;
if ( timeValue - usedTime > 0 )
{
DisplayTime(timeValue - usedTime);
}
else
{
DisplayTime(0);
}
}
Не могли бы вы немного объяснить, как именно это решает проблему, когда добавление для таймера, как описано OP?
@derHugo, потому что большое число с плавающей запятой не может минусовать небольшое значение, подобное этому: float f = 100000f - 0.001f;
это f
всегда будет 100000f, а не минус.
проблема здесь:
timeValue -= Time.deltaTime
, поплавок имеет небольшое отклонение