Menu
CoddyTech

Noch einmal spielen

Lektion 12 von 14 im Kurs Unity-Spiel: 3D-Snake von Coddy.

Wenn die Schlange stirbt, erscheint ein Game-Over-Fenster mit einer Schaltfläche „Erneut spielen“. Das Fenster befindet sich im HUD und ist anfangs ausgeblendet. SetActive(true) zeigt es an. Die Schlange weiß, wann sie stirbt, und der GameManager verwaltet die Bildschirme. Deshalb ruft Die() eine öffentliche Methode GameOver() des GameManagers auf.

„Erneut spielen“ startet das Spiel neu, indem die Szene erneut geladen wird. Alle Objekte kehren in den Zustand zurück, den die Szene vorgibt: die Schlange auf ihrem ersten Feld mit zwei Segmenten, die Punktzahl bei 0 und das Fenster ausgeblendet. Die Schaltfläche „Erneut versuchen“ eines Rennspiels ist auf dieselbe Weise verknüpft:

void Start()
{
    retryButton.onClick.AddListener(Retry);
}

void Retry()
{
    SceneManager.LoadScene("Track1");
}

Das Laden anhand des Namens bindet die Schaltfläche an eine bestimmte Szene. SceneManager.GetActiveScene().buildIndex gibt die laufende Szene an. Wenn sie geladen wird, startet also die Szene neu, in der sich die Schaltfläche befindet. Die neue Szene enthält einen neuen GameManager, dessen Awake() Instance erneut festlegt. Dadurch kommuniziert die neue Schlange mit dem neuen GameManager.

challenge icon

Aufgabe

Mittel

Das HUD verfügt über ein verborgenes GameOverPanel mit einem PlayAgainButton, und die Szene legt beides in GameManager fest.

  1. Füge in GameManager using UnityEngine.UI;, using UnityEngine.SceneManagement;, public GameObject gameOverPanel; und public Button playAgainButton; hinzu.
  2. Schreibe public void GameOver(), das das Panel anzeigt.
  3. Schreibe void PlayAgain(), das die aktive Szene erneut lädt, und veranlasse in Start(), dass die Schaltfläche die Methode aufruft.
  4. Rufe in Snakes Die() GameOver() auf.

Drücke Play, lass dich crashen, spiele erneut und drücke dann Check.

Probier es selbst

using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Snake snake;
    public GameObject foodPrefab;
    public TMP_Text scoreText;
    private Transform food;
    private int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        scoreText.text = "Score: 0";
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    public bool IsFood(Vector3 cell)
    {
        return cell == food.position;
    }

    public void Eat()
    {
        score++;
        scoreText.text = "Score: " + score;
        MoveFood();
    }

    void MoveFood()
    {
        List<Vector3> free = new List<Vector3>();
        for (int x = -snake.edge; x <= snake.edge; x++)
        {
            for (int z = -snake.edge; z <= snake.edge; z++)
            {
                Vector3 cell = new Vector3(x, 0f, z);
                if (!snake.Occupies(cell))
                {
                    free.Add(cell);
                }
            }
        }
        food.position = free[Random.Range(0, free.Count)];
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unity-Spiel: 3D-Snake