Un solo script ejecuta el juego
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 12 de 60.
Pon la puntuación en el script del jugador, las vidas en un script de salud y la comprobación del fin del juego en un tercero, y cada script necesita los números de los demás, así que cada regla nueva afecta a varios archivos. Los juegos de Unity suelen asignar esos números a un solo script, el GameManager, en un GameObject vacío propio. Este se encarga de la puntuación, las vidas y la regla que termina el juego. Los demás scripts solo informan de lo que ha ocurrido llamando a sus métodos públicos. En esta tanda de penaltis, la red informa de cada gol:
public class GameManager : MonoBehaviour
{
private int goals;
private int shotsLeft = 5;
public void ShotTaken(bool scored)
{
if (shotsLeft == 0) return;
shotsLeft--;
if (scored) goals++;
Debug.Log("Goals: " + goals + ", shots left: " + shotsLeft);
if (shotsLeft == 0) Debug.Log("Full time: " + goals + " goals");
}
}// Net.cs, en el activador de la portería
public GameManager game;
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Ball")) game.ShotTaken(true);
}La red no sabe cuántos tiros quedan ni cuándo termina el juego. Informa de un gol y el administrador decide qué significa; el script del portero informa de una parada con game.ShotTaken(false). Para una tanda de 3 tiros, cambias un número en un solo script. La comprobación al principio de ShotTaken impide que se cuente un balón que entre rodando después del final del partido.
Rellenas el campo game en el Inspector arrastrando el objeto GameManager hasta él, y Unity encuentra el script GameManager en ese objeto. El administrador también es el lugar adecuado para el HUD: cuando contiene el texto de la puntuación y el panel de fin del juego, la pantalla cambia en el mismo método que modifica los números, y ningún otro script interactúa con la interfaz de usuario.
Desafío
FácilHaz que GameManager lleve la cuenta de la puntuación y las vidas.
AddScore(int points): sigameOverno es verdadero, suma ascorey muestraScore: 6enscoreText.LoseLife(): resta 1 alivesy muestraLives: 2; cuando llegue a 0, establecegameOver, muestragameOverPanely estableceplayer.enabled = false.- En
GemyBomb, cuandoother.CompareTag("Player"), llama agame.AddScore(points)ogame.LoseLife()y después aDestroy(gameObject).
Pulsa «Jugar» y golpea tres bombas. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public TMP_Text scoreText;
public TMP_Text livesText;
public GameObject gameOverPanel;
public Player player;
private int score;
private int lives = 3;
private bool gameOver;
public void AddScore(int points)
{
// suma los puntos y muestra la nueva puntuación, a menos que el juego haya terminado
}
public void LoseLife()
{
// quita una vida y muestra las vidas restantes; al llegar a 0 vidas, el juego termina
}
}
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