Ein Skript steuert das Spiel
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 12 von 60.
Lege den Punktestand im Skript des Spielers, die Leben in einem Gesundheitsskript und die Prüfung auf Spielende in einem dritten Skript ab. Jedes Skript benötigt also die Zahlen der anderen, sodass jede neue Regel mehrere Dateien betrifft. In Unity-Spielen verwaltet normalerweise ein einzelnes Skript diese Zahlen: der GameManager auf einem eigenen leeren GameObject. Er verwaltet den Punktestand, die Leben und die Regel, die das Spiel beendet. Andere Skripte melden nur, was passiert ist, indem sie seine öffentlichen Methoden aufrufen. Bei diesem Elfmeterschießen meldet das Tor jeden Treffer:
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, am Trigger des Tors
public GameManager game;
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Ball")) game.ShotTaken(true);
}Das Tor weiß nicht, wie viele Schüsse noch übrig sind oder wann das Spiel endet. Es meldet einen Treffer, und der Manager entscheidet, was das bedeutet; das Skript des Torwarts meldet mit game.ShotTaken(false) eine Parade. Für ein Elfmeterschießen mit 3 Schüssen änderst du eine Zahl in einem Skript. Die Prüfung am Anfang von ShotTaken verhindert, dass ein Ball, der nach dem Abpfiff ins Tor rollt, noch gezählt wird.
Du füllst das Feld game im Inspector aus, indem du das GameManager-Objekt darauf ziehst. Unity findet dann das GameManager-Skript auf diesem Objekt. Der Manager ist auch der richtige Ort für das HUD: Wenn er den Punktestandtext und das Spielende-Panel enthält, ändert sich der Bildschirm in derselben Methode wie die Zahlen, und kein anderes Skript greift auf die Benutzeroberfläche zu.
Aufgabe
EinfachLass den GameManager Punkte und Leben verwalten.
AddScore(int points): Erhöhescore, soferngameOvernicht gesetzt ist, und zeigeScore: 6inscoreTextan.LoseLife(): Ziehe 1 vonlivesab und zeigeLives: 2an; setze bei 0gameOver, zeigegameOverPanelan und setzeplayer.enabled = false.- Rufe in
GemundBomb, wennother.CompareTag("Player")zutrifft,game.AddScore(points)odergame.LoseLife()auf und führe anschließendDestroy(gameObject)aus.
Klicke auf „Spielen“ und triff drei Bomben. Klicke dann auf „Prüfen“.
Probier es selbst
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)
{
// Addiere die Punkte und zeige den neuen Punktestand an, sofern das Spiel nicht vorbei ist
}
public void LoseLife()
{
// Ziehe ein Leben ab und zeige die verbleibenden Leben an; bei 0 Leben ist das Spiel vorbei
}
}
Alle Lektionen in Echte Spiele entwickeln
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer2Buttons und Bildschirme
Buttons und onClickLambdasVerknüpfungen im InspectorPanels ein- und ausblendenGesundheitsbalkenRückblick: Upgrade-Shop5Speichern mit PlayerPrefs
Eine Zahl speichernMit einem Standardwert ladenHöchstpunktzahlEinstellungen speichernRückblick: Münzen auf der Bank3Der Spielmanager
Ein Skript steuert das SpielDas SingletonSpielzuständeZum Zustand wechselnRückblick: RundenmanagerÜbe selbstständig: Unity-Playground