Menu
CoddyTech

Recorde

Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 24 de 60.

Uma pontuação máxima é o melhor resultado de cada partida, então ela fica em PlayerPrefs e só muda quando uma partida a supera. Esta mesa de pinball verifica quando a última bola cai:

void GameOver()
{
    int best = PlayerPrefs.GetInt("PinballBest", 0);
    if (score > best)
    {
        PlayerPrefs.SetInt("PinballBest", score);
        PlayerPrefs.Save();
        Debug.Log("New high score: " + score);
    }
}

A comparação é o que faz dela uma pontuação máxima. Sem ela, uma partida com 300 depois de uma pontuação máxima de 5000 salvaria 300, e o recorde seria perdido. Compare com a pontuação máxima salva, não com algo que começa em 0 a cada partida: um campo sem nenhum valor carregado é 0 após cada reinício, então qualquer pontuação o supera. score > best mantém o recorde antigo em caso de empate, enquanto score >= best consideraria um empate como uma nova pontuação máxima.

Para mostrar a pontuação máxima durante a partida, carregue-a em um campo em Start() e exiba esse campo. Quando uma partida superar essa pontuação, atualize o campo, PlayerPrefs e o texto juntos, para que a tela e o valor salvo nunca fiquem divergentes.

challenge icon

Desafio

Médio

Mantenha uma pontuação máxima sob a chave BestPoints.

  1. Em Start(), acima de ShowBest();, escreva best = PlayerPrefs.GetInt("BestPoints", 0);.
  2. Em EndRound(), dentro de if (points > best): defina best = points;, salve com PlayerPrefs.SetInt e PlayerPrefs.Save() e, em seguida, chame ShowBest(); e newBestText.SetActive(true);.

Pressione “Jogar” e bombeie um balão (mantenha Espaço pressionado e solte); depois, pressione Parar e “Jogar”: a pontuação máxima permanece. Em seguida, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;
using TMPro;

public class BalloonPump : MonoBehaviour
{
    public TMP_Text pointsText;
    public TMP_Text bestText;
    public GameObject newBestText;
    public float pumpRate = 20f;

    private float air;
    private int points;
    private int best;
    private bool roundOver;

    void Start()
    {
        ShowBest();
    }

    void Update()
    {
        if (roundOver) return;

        if (Input.GetKey(KeyCode.Space))
        {
            air += pumpRate * Time.deltaTime;
            transform.localScale = Vector3.one * (1f + air / 50f);
            pointsText.text = "Points: " + Mathf.FloorToInt(air);
            if (air > 100f)
            {
                points = 0;
                pointsText.text = "Pop! Points: 0";
                GetComponent<Renderer>().enabled = false;
                roundOver = true;
                EndRound();
            }
        }
        else if (Input.GetKeyUp(KeyCode.Space))
        {
            points = Mathf.FloorToInt(air);
            pointsText.text = "Points: " + points;
            roundOver = true;
            EndRound();
        }
    }

    void EndRound()
    {
        // Salve um novo recorde aqui
    }

    void ShowBest()
    {
        bestText.text = "Best: " + best;
    }
}

Todas as lições de Criando Jogos de Verdade

Pratique por conta própria: Playground de Unity