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.
Desafio
MédioMantenha uma pontuação máxima sob a chave BestPoints.
- Em
Start(), acima deShowBest();, escrevabest = PlayerPrefs.GetInt("BestPoints", 0);. - Em
EndRound(), dentro deif (points > best): definabest = points;, salve comPlayerPrefs.SetIntePlayerPrefs.Save()e, em seguida, chameShowBest();enewBestText.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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro2Botões e telas
Botões e onClickLambdasConectando no InspectorPainéis ligados e desligadosBarras de vidaRevisão: Loja de melhorias5Salvando com PlayerPrefs
Salvar um númeroCarregar com um valor padrãoRecordeSalvar configuraçõesRevisão: Moedas no bancoPratique por conta própria: Playground de Unity