Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Ayuda con funcionalidad DateTime

Iniciado por Alfonso, Septiembre 07, 2018, 07:28:33 PM

Tema anterior - Siguiente tema
Septiembre 07, 2018, 07:28:33 PM Ultima modificación: Septiembre 07, 2018, 10:11:37 PM por pioj
Buenas tardes a todos. Voy a tener que robaros unos minutos de vuestro tiempo (puede que incluso menos) con un problema que tengo. Paso a explicar:
 
Estoy terminando de perfilar algunos temas de un videojuego de tipo arcade. El caso es que este juego funciona a través de vidas. Una vez pierdes las vidas, se activa un temporizador progresivo (1, 2, 3, 4, .....) y cuando llega a 15 minutos, el temporizador desaparece y vuelven las vidas o, al menos, eso me gustaria que hiciera. El caso es que cuando se activa entra en una especie de bucle que produce lo siguiente. al pasar 15 minutos, vidas. Si pasa una hora y doce minutos, por ejemplo, el temporizador sigue activo, cuado llega a una hora y 15 minutos, vidas. Es decir, cada vez que pasa una hora desde que se activo el temporizador, se repite el bucle de recuperacion, no se si me explico del todo bien. Esto esta provocandome un dolor de cabeza bastante intenso pues no se por donde atacar al script en cuestión, que es este:
 

{
    DateTime tiempo;
    TimeSpan diferencia;
   
    public Text texto;
    public GameObject aviso;
    public GameObject crono;
 
    private void Awake()
    {
        if (PlayerPrefs.GetInt("ContadorVidas") == 0)
        {
            Vidas.vidas = PlayerPrefs.GetInt("ContadorVidas");
        }
    }
 
    void Start()
    {
      
        GestorTiempo();
 
    }
//la clase guardarhora se llama desde el script vidas cuando te quedas sin ninguna
    public static void GuardarHora()
    {
        PlayerPrefs.SetString("Hora", DateTime.Now.ToString());
 
    }
    private void Update()
    {
        print(diferencia);
        print(diferencia.Minutes);
    }
    public void GestorTiempo()
    {
        if(Vidas.vidas < 1) {
            if (PlayerPrefs.HasKey("Hora"))
            {
                tiempo = Convert.ToDateTime(PlayerPrefs.GetString("Hora"));
                diferencia = DateTime.Now - tiempo;
                if (diferencia.Minutes > 14)
                {
                    Vidas.vidas = Vidas.vidas + 3;
                    aviso.SetActive(false);
                    if (PlayerPrefs.HasKey("ContadorVidas"))
                    {
                            PlayerPrefs.SetInt("ContadorVidas", Vidas.vidas);
                    }
                }
 
            }
            if (diferencia.Minutes<15 && Vidas.vidas < 1){
                aviso.SetActive(true);
                crono.SetActive(true);
                texto.text = "No tienes vidas. Tiempo esperado " + diferencia.Minutes.ToString() + " de 15 Minutos";          
        }
        }
    }
}

 
 
 
Eso es lo que tengo realizado para la gestion del tiempo. Como veis, es bastante simple en esencia pero no se como cortar el bucle. He probado añadiendo varios condicionantes con respecto a las vidas, es decir, en el Start por ejemplo, añadir un if con la variable vidas como detonador, pero sin ningun tipo de resultado.
 
El problema esta localizado, estoy seguro, pues asi me lo muestra la consola de unity, pero no tengo bemoles de resolverlo. Como habreis podido observar, mi estilo de programación dista mucho de ser pulido, pero con el tiempo espero seguir mejorandolo.
 
Espero cualquier respuesta y toda ayuda es bienvenida.
 
Muchas gracias por vuestro tiempo y un saludo
 
 

Si lo que te interesa es un diferencia horaria te recomendaria que guardes el total de minutos y no la hora.
 

public static void SaveTime()
{
PlayerPrefs.SetInt("_lastTime", DateTime.Minute);
}

 
Luego creas una funcion para evaluar el tiempo...
 

public static bool Evaluate(int minutes)
{
if(!PlayerPrefs.HasKey("_lastTime"))
   return true;

return (DateTime.Now.Minute - PlayerPrefs.GetInt("_lastTime")) >= minutes;
}

 
Te recomendaria que a la función Evaluate la llames cada 10 segundos - Puede ser con un InvokeRepeat!

Cita de: francoe1 date=1536357459Si lo que te interesa es un diferencia horaria te recomendaria que guardes el total de minutos y no la hora.
   
   

public static void SaveTime()
{
PlayerPrefs.SetInt("_lastTime", DateTime.Minute);
}

   
      Luego creas una funcion para evaluar el tiempo...
   
   

public static bool Evaluate(int minutes)
{
if(!PlayerPrefs.HasKey("_lastTime"))
   return true;

return (DateTime.Now.Minute - PlayerPrefs.GetInt("_lastTime")) >= minutes;
}

   
      Te recomendaria que a la función Evaluate la llames cada 10 segundos - Puede ser con un InvokeRepeat!
   


Muchas Gracias por la ayuda

Etiquetas: