Menu
CoddyTech

Um Script Controla o Jogo

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

Coloque a pontuação no script do jogador, as vidas em um script de saúde e a verificação de fim de jogo em um terceiro; assim, cada script precisa dos números dos outros, e cada nova regra afeta vários arquivos. Jogos Unity geralmente atribuem esses números a um único script, o GameManager, em um GameObject vazio próprio. Ele controla a pontuação, as vidas e a regra que encerra o jogo. Os outros scripts apenas informam o que aconteceu, chamando os métodos públicos dele. Nesta disputa de pênaltis, a rede informa 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, no gatilho do gol
public GameManager game;

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Ball")) game.ShotTaken(true);
}

A rede não sabe quantos chutes restam nem quando o jogo termina. Ela informa um gol, e o gerenciador decide o que isso significa; o script do goleiro informa uma defesa com game.ShotTaken(false). Para uma disputa de 3 chutes, você altera um número em um único script. A verificação no início de ShotTaken impede que uma bola que entre rolando depois do fim do jogo conte como gol.

Você preenche o campo game no Inspector arrastando o objeto GameManager até ele, e o Unity encontra o script GameManager nesse objeto. O gerenciador também é o lugar do HUD: quando ele contém o texto da pontuação e o painel de fim de jogo, a tela muda no mesmo método que altera os números, e nenhum outro script mexe na interface.

challenge icon

Desafio

Fácil

Deixe o GameManager controlar a pontuação e as vidas.

  1. AddScore(int points): se gameOver não estiver ativado, adicione à score e mostre Score: 6 em scoreText.
  2. LoseLife(): subtraia 1 de lives e mostre Lives: 2; quando chegar a 0, ative gameOver, mostre gameOverPanel e defina player.enabled = false.
  3. Em Gem e Bomb, quando other.CompareTag("Player"), chame game.AddScore(points) ou game.LoseLife() e, em seguida, Destroy(gameObject).

Pressione “Jogar” e atinja três bombas. Depois, “Verificar”.

Experimente você mesmo

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)
    {
        // adicione os pontos e mostre a nova pontuação, a menos que o jogo tenha acabado
    }

    public void LoseLife()
    {
        // desconte uma vida e mostre quantas restam; com 0 vidas, o jogo acaba
    }
}

Todas as lições de Criando Jogos de Verdade

Pratique por conta própria: Playground de Unity