Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Após salvar a pontuação máxima pela primeira vez não exibe novamente.

Olá, tudo bem? Segui essa aula até o final, mas esotu com um problema:

Até o ponto em que a pontuação máxima era atualizada TODA vez, tudo estava funcionando, mas apartir do momento que comecei a colocar a pontuação máxima para aparecer mesmo caso a pontuação fosse menor (usando o PlayerPrefs), agora só mostra a pontuação máxima da primeira vez que executo o jogo.

Para testar isso fiz um primeiro teste e morri em 13 segundos. Ele mostrou que a pontuação máxima era 13 segundos. Depois, quando sobrevivi por 20, ele não atualizou a pontuiação máxima. (Nem utilizando o botão de jogar novamente e nem tirando o play e dando play novamente na unity).

O código está assim:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class ControlaInterface : MonoBehaviour
{

    private ControladorJogador scriptControladorJogador;
    public Slider sliderVidaJogador;
    public GameObject painelGameOver;
    public Text textoTempoSobrevivencia;
    public Text textoPontuacaoMaxima;
    private float tempoPontuacaoSalva;

    // Start is called before the first frame update
    void Start()
    {
        scriptControladorJogador = GameObject.FindWithTag("Player").GetComponent<ControladorJogador>();
        sliderVidaJogador.maxValue = scriptControladorJogador.meuStatusJogador.Vida;
        AtualizarSliderVidaJogador();
        Time.timeScale = 1;
        tempoPontuacaoSalva = PlayerPrefs.GetFloat("PontuacaoMaxima");
    }

    public void AtualizarSliderVidaJogador()
    {
        sliderVidaJogador.value = scriptControladorJogador.meuStatusJogador.Vida;
    }

    public void GameOver()
    {
        Time.timeScale = 0;
        painelGameOver.SetActive(true);

        int minutos = (int)(Time.timeSinceLevelLoad / 60);
        int segundos = (int)(Time.timeSinceLevelLoad % 60);
        textoTempoSobrevivencia.text = "Voce sobreviveu por " + minutos + " minutos e " + segundos + " segundos.";

        AjustarPontuacaoMaxima(minutos, segundos);
    }

    void AjustarPontuacaoMaxima(int min, int seg)
    {
        if(Time.timeSinceLevelLoad > tempoPontuacaoSalva)
            {
                tempoPontuacaoSalva = Time.timeSinceLevelLoad;
                textoPontuacaoMaxima.text = string.Format("Seu melhor tempo é {0} minutos e {1} segundos.", min, seg);

                PlayerPrefs.SetFloat("PontuacaoMaxima", tempoPontuacaoSalva);
            }
            if (textoPontuacaoMaxima.text == "")
            {
                min = (int)tempoPontuacaoSalva / 60;
                seg = (int)tempoPontuacaoSalva % 60;
                textoPontuacaoMaxima.text = string.Format("Seu melhor tempo é {0} minutos e {1} segundos.", min, seg);
            }

    }

    public void Reiniciar()
    {
        SceneManager.LoadScene("Game");
    }
}
4 respostas

Oi, Giovanna eu recomendo definir uma variável para cada porque pode ser a referência da variável dando problema.

Então você trocaria isso:

min = (int)tempoPontuacaoSalva / 60;
seg = (int)tempoPontuacaoSalva % 60;
textoPontuacaoMaxima.text = string.Format("Seu melhor tempo é {0} minutos e {1} segundos.", min, seg);

por:

int minMax = (int)tempoPontuacaoSalva / 60;
int segMax = (int)tempoPontuacaoSalva % 60;
textoPontuacaoMaxima.text = string.Format("Seu melhor tempo é {0} minutos e {1} segundos.", minMax, segMax);

Mudei isso, mas ele continua sem mostrar mais a frase de pontuação máxima (por exemplo, após mudar isso joguei mais duas vezes, uma vez sobrevivendo a 12 segundos e outra vez até 20 segundos. Nenhuma das vezes mostrou a frase em laranja(no meu ela está em vermelho, mas dá na mesma), parece que de fato apenas registrou e mostrou a primeira pontuação máxima (a de 13 segundos que foi quando joguei logo após implementar isso no código) e depois nunca mais.

Vou colocar um link para o projeto para que você possa ver :)

https://drive.google.com/file/d/1E_C6QkDNIIfzxEKoEDOXhV_vRQL7xA-o/view?usp=share_link

solução!

Oi, Giovanna, tudo bem?

Isso tá acontecendo porque no painel de pontuação o texto de pontuação máxima tem um enter então ele não é == "" como melhoria de código a gente poderia fazer isso a todo tempo, algo como:

if(Time.timeSinceLevelLoad > tempoPontuacaoSalva)
{
   tempoPontuacaoSalva = Time.timeSinceLevelLoad;
   PlayerPrefs.SetFloat("PontuacaoMaxima", tempoPontuacaoSalva);
}

min = (int)tempoPontuacaoSalva / 60;
seg = (int)tempoPontuacaoSalva % 60;
textoPontuacaoMaxima.text = string.Format("Seu melhor tempo é {0} minutos e {1} segundos.", min, seg);

Assim você sempre pega a pontuação salva mais atualizada, seja a atual ou a anterior! Bons estudos!

Opa!

Agora realmente funcionou, obrigada!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software