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--;
}
}
}
Часы, минуты и секунды задаю с инспектора. Мне не нужен сверхточный таймер, но принцип правильный? А может есть какие-нибудь более легкие способы, встроенные функции и т.д.?
@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.
все писалось исключительно в рамках псевдокода и может не сработать при копировании, но тут главное понять подход.
Я бы сделал приватное поле 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
}
ты просто запомнил абсолютное время когда уже можно войти в бонусную игру
дальше в отдельном MyBonusTimeHandler:MonoBehaviour используй Invoke('название метода который активирует возможность',DateTime.Now - PlayerPrefsNextBonusGameTime); в методе Start()
движек сам вызовет тот метод через указанное время
время в float если я ошибся выше, не помню про перегрузки
Зачем извращаться и писать свой таймер, когда в C# есть TimeSpan ?
Просто вызываете TimeSpan.Add к уже имеющемуся времени и добавляете необходимое время.
Хотите на экран выводить? Есть множество форматов в ToString().
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости