Question by
unity_35906D23077B33E16848 · Apr 16, 2021 at 03:16 PM ·
codepage
I can’t keep the timer
I want to make a timer that is saved the running time of when you lose a life, when you restart the game if you save until the last life you have but the clock doesn’t keep counting if not that it restarts and the player will never get life out of the game, otherwise you will have to wait while the App is still on, please help. I’d like something like candy crush.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class EnergyManager : MonoBehaviour
{
[SerializeField]
private Text textEnergy;
[SerializeField]
private Text textTimer;
[SerializeField]
private int maxEnergy;
private int totalEnergy = 7;
private DateTime nextEnergyTime;
private DateTime lastAddedTime;
private int restoreDuration = 1800;
private bool restoring = false;
private void Start()
{
Load();
StartCoroutine(RestoreRoutine());
}
public void UseEnergy()
{
if (totalEnergy == 0)
return;
totalEnergy--;
UpdateEnergy();
if (!restoring)
{
if (totalEnergy + 1 == maxEnergy)
{
nextEnergyTime = AddDuration(DateTime.Now, restoreDuration);
}
StartCoroutine(RestoreRoutine());
}
}
private IEnumerator RestoreRoutine()
{
UpdateTimer();
UpdateEnergy();
restoring = true;
while (totalEnergy < maxEnergy)
{
DateTime currentTime = DateTime.Now;
DateTime counter = nextEnergyTime;
bool isAdding = false;
while(currentTime > counter)
{
if (totalEnergy < maxEnergy)
{
isAdding = true;
totalEnergy++;
DateTime timeToAdd = lastAddedTime > counter ? lastAddedTime : counter;
counter = AddDuration(timeToAdd, restoreDuration);
}
else
break;
}
if (isAdding)
{
lastAddedTime = DateTime.Now;
nextEnergyTime = counter;
}
UpdateTimer();
UpdateEnergy();
Save();
yield return null;
}
restoring = false;
}
private void UpdateTimer()
{
if(totalEnergy >= maxEnergy)
{
textTimer.text = "Full";
return;
}
TimeSpan t = nextEnergyTime - DateTime.Now;
string value = String.Format("{0}:{1:D2}:{2:D2}",(int) t.TotalHours, t.Minutes, t.Seconds);
textTimer.text = value;
}
private void UpdateEnergy()
{
textEnergy.text = totalEnergy.ToString();
}
private DateTime AddDuration(DateTime time, int duration)
{
return time.AddMinutes(duration);
}
private void Load()
{
totalEnergy = PlayerPrefs.GetInt("totalEnergy");
nextEnergyTime = StringToDate(PlayerPrefs.GetString("nextEnergyTime"));
lastAddedTime = StringToDate(PlayerPrefs.GetString("lastAddedTime"));
}
private void Save()
{
PlayerPrefs.SetInt("totalEnergy", totalEnergy);
PlayerPrefs.SetString("nextEnegyTime", nextEnergyTime.ToString());
PlayerPrefs.SetString("lastAddedTime", lastAddedTime.ToString());
}
private DateTime StringToDate(string date)
{
if (String.IsNullOrEmpty(date))
{
return DateTime.Now.AddSeconds(restoreDuration);
}
else
{
return DateTime.Parse(date);
}
}
}
Comment