Menu
CoddyTech

Zusammenstoß und Neustart

Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 31 von 56.

challenge icon

Aufgabe

Mittel

Ein Zusammenstoß beendet den Lauf, und eine Schaltfläche startet den nächsten. Behalte alles aus den vorherigen Lektionen bei. Die Canvas enthält ein ausgeblendetes GameOverPanel mit einem RestartButton mit der Beschriftung Run again, und die Szene füllt zwei neue Felder von GameManager aus: gameOverPanel und restartButton. Der Runner hat einen kinematischen Rigidbody und erhält daher Trigger-Nachrichten von den Hindernissen.

In GameManager:

  • Oberhalb der Klasse deklarierst du public enum GameState { Playing, GameOver } und gibst der Klasse ein Feld public GameState state, das mit Playing beginnt.
  • Füge using UnityEngine.UI;, using UnityEngine.SceneManagement;, public GameObject gameOverPanel; und public Button restartButton; hinzu.
  • Eine öffentliche Methode GameOver() setzt state auf GameOver, setzt speed auf 0, wodurch alle Hindernisse angehalten werden, und zeigt das Panel an.
  • Update() tut nichts, wenn der Zustand nicht Playing ist, sodass Geschwindigkeit und Distanz anhalten.
  • Sorge in Start() dafür, dass restartButton die gerade laufende Szene neu lädt.

In Runner: Wenn er in einen Trigger mit dem Tag Obstacle eintritt, rufst du GameManager.Instance.GameOver() auf. Solange der Zustand nicht Playing ist, bewirken die Pfeiltasten nichts.

In Spawner: Erzeuge nichts, solange der Zustand nicht Playing ist.

Drücke Play, stoße zusammen und starte erneut, dann Check.

Probier es selbst

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public float speed = 10f;
    public float speedUp = 0.5f;
    public float maxSpeed = 20f;
    public TMP_Text distanceText;
    private float distance;

    void Awake()
    {
        Instance = this;
    }

    void Update()
    {
        speed = Mathf.Min(speed + speedUp * Time.deltaTime, maxSpeed);
        distance += speed * Time.deltaTime;
        distanceText.text = "Distance: " + Mathf.FloorToInt(distance) + " m";
    }
}

Alle Lektionen in Echte Spiele entwickeln