Правильно ли я сделал таймер?

161
20 августа 2019, 22:10
public float hour, min, sec;
void Update(){
     TimerStart();
}
void TimerStart()
    {
        if (hour >= 0)
        {
            sec -= Time.deltaTime;
            if (sec < 0)
            {
                sec = 59;
                min--;
            }
            if (min < 0)
            {
                min = 59;
                hour--;
            }
        }
    }

Часы, минуты и секунды задаю с инспектора. Мне не нужен сверхточный таймер, но принцип правильный? А может есть какие-нибудь более легкие способы, встроенные функции и т.д.?

Answer 1

@Andrew когда прошел например: текущий бонусный уровень, то повторно можно играть только через, нуу, 48 часов. Таймер срабатывает, при выходе из игры сохраняет в PlayerPrefs часы, минуты, секунды, при входе в игру вычитывает время отсутствия с таймера.

Мои подозрения оправдались :)

В даном конкретном случае таймер не нужен ВОВСЕ. Все что тебе нужно -- запомнить время когда можно будет делать следующую итерацию. В даном случае пусть будет вызов метода BonusGame()

будет как-то так:

public void BonusGame()
{ 
    if( DateTime.Now > PlayerPrefsNextBonusGameTime)
    { 
        //some bonus Game Logic
    }
}

а что бы показать время оставшийся до возможной игры в бонусную игру, то нужно что-то вроде:

public TimeSpan TimeLeftToBonusGame {
    get { 
        return DateTime.Now - PlayerPrefsNextBonusGameTime ;
    }
}

где PlayerPrefsNextBonusGameTime -- DateTime.

все писалось исключительно в рамках псевдокода и может не сработать при копировании, но тут главное понять подход.

Answer 2

Я бы сделал приватное поле private float secondsLeft, в методе Start инициализировал его как secondsLeft = hour*60*60 + min*60 + sec и в методе Update добавил бы строки

secondsLeft -= Time.deltaTime
if (secondsLeft <= 0)
{
    //do smth
}

Полностью:

public float hour, min, sec;
private float secondsLeft;
void Start()
{
    secondsLeft = hour*60*60 + min*60 + sec;
}
void Update()
{
    secondsLeft -= Time.deltaTime
    if (secondsLeft <= 0)
    {
        //do smth
    }
}

Либо использовать корутины (про это советую почитать отдельно, очень полезная вещь). Приведу просто пример:

public float hour, min, sec;
void Start()
{
    StartCoroutine(Timer(hour*60*60 + min*60 + sec));
}
private IEnumerator Timer(float secondsToWait)
{
    yield return new WaitForSeconds(secondsToWait);
    //do smth after timer
    yield return null
}
Answer 3

ты просто запомнил абсолютное время когда уже можно войти в бонусную игру
дальше в отдельном MyBonusTimeHandler:MonoBehaviour используй Invoke('название метода который активирует возможность',DateTime.Now - PlayerPrefsNextBonusGameTime); в методе Start()
движек сам вызовет тот метод через указанное время время в float если я ошибся выше, не помню про перегрузки

Answer 4

Зачем извращаться и писать свой таймер, когда в C# есть TimeSpan ?

Просто вызываете TimeSpan.Add к уже имеющемуся времени и добавляете необходимое время.

Хотите на экран выводить? Есть множество форматов в ToString().

READ ALSO
Персонаж должен тащить обьект [закрыт]

Персонаж должен тащить обьект [закрыт]

подскажите как это реализовать:Персонаж должен тащить объектВ инете искал ничего не нашел

152
MVVM Получить View в View Model

MVVM Получить View в View Model

У меня имеется окно авторизации: TextBox для логина, PasswordBox для пароля и кнопочка - ВойтиПосле того как пользователь вводит данные мне нужно проверить...

181
Как просто работать с / открыть / изменить / сохранить Excel - xlsx / CSV файлы

Как просто работать с / открыть / изменить / сохранить Excel - xlsx / CSV файлы

Сколько я ни искал, всё как-то уж больно сложно и избыточно функционально

196
Проблема подключения Sql Server к Visual Studio

Проблема подключения Sql Server к Visual Studio

Проблема вот в чемЕсть MS sql server Manager studio и MS sql server 2012

169