Puntuación más alta
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 24 de 60.
La puntuación máxima es el mejor resultado de todas las partidas jugadas, así que se guarda en PlayerPrefs y solo cambia cuando una partida la supera. Esta mesa de pinball comprueba el resultado cuando se pierde la última bola:
void GameOver()
{
int best = PlayerPrefs.GetInt("PinballBest", 0);
if (score > best)
{
PlayerPrefs.SetInt("PinballBest", score);
PlayerPrefs.Save();
Debug.Log("New high score: " + score);
}
}La comparación es lo que hace que sea una puntuación máxima. Sin ella, una partida con 300 puntos después de haber logrado una puntuación máxima de 5000 guardaría 300 y se perdería el récord. Compara con la mejor puntuación guardada, no con un valor que empieza en 0 en cada partida: un campo que no carga ningún valor es 0 después de cada reinicio, así que cualquier puntuación lo supera. score > best conserva el récord anterior en caso de empate, mientras que score >= best consideraría un empate como una nueva puntuación máxima.
Para mostrar la puntuación máxima durante la partida, cárgala en un campo en Start() y muestra ese campo. Cuando una partida la supere, actualiza el campo, PlayerPrefs y el texto a la vez, para que la pantalla y el valor guardado nunca discrepen.
Desafío
IntermedioGuarda una puntuación alta con la clave BestPoints.
- En
Start(), encima deShowBest();, escribebest = PlayerPrefs.GetInt("BestPoints", 0);. - En
EndRound(), dentro deif (points > best): establecebest = points;, guárdalo conPlayerPrefs.SetIntyPlayerPrefs.Save(), después llama aShowBest();ynewBestText.SetActive(true);.
Pulsa «Jugar» e infla un globo (mantén pulsada la barra espaciadora y suéltala); después, pulsa «Detener» y «Jugar»: se conserva la puntuación más alta. Después, pulsa «Comprobar».
Pruébalo tú mismo
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()
{
// Guarda aquí un nuevo récord
}
void ShowBest()
{
bestText.text = "Best: " + best;
}
}
Todas las lecciones de Creación de juegos reales
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: Corredor sin fin
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entradaPractica por tu cuenta: Playground de Unity