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 56.

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, e cada script precisa dos números dos outros, então 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 seus métodos públicos. 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 ainda 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 seja contabilizada.

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 para o 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

Uma caça às gemas. As setas movimentam o Player (seu script está pronto). As gemas valem seus points, as bombas custam uma vida, e um GameManager gerencia tudo. O Inspector já vincula o campo game de cada gema e bomba ao objeto GameManager, e os campos do GameManager à HUD e ao Player.

Em GameManager.cs:

  • AddScore(int points) adiciona os pontos a score e os exibe em scoreText, como Score: 6.
  • LoseLife() subtrai 1 de lives (3 no início) e o exibe em livesText, como Lives: 2.
  • Quando lives chega a 0, o jogo acaba: exiba gameOverPanel e desative o script do Player para que as setas parem de funcionar. Depois disso, AddScore não altera nada.

Em Gem.cs e Bomb.cs: quando o Player (com a tag Player) toca em uma delas, ela informa ao jogo (uma gema informa seus points, uma bomba informa uma vida perdida) e se remove.

Pressione Play, colete as gemas e atinja as bombas; depois, Check.

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 a quantidade restante; com 0 vidas, o jogo acaba
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Criando jogos de verdade