Spielzustände
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 14 von 56.
Ein Spiel befindet sich immer in genau einem Zustand: Es wartet auf den Spieler, läuft oder ist beendet. Zwei boolesche Werte wie isPlaying und isOver können versehentlich beide den Wert true annehmen, und eine Zeichenfolge wie "Playng" wird kompiliert, stimmt aber nie überein. C# hat einen Typ für eine feste Auswahl von Möglichkeiten: das enum. Diese Fußgängerampel verwendet eines:
public enum Signal { Red, Yellow, Green }
public class Crossing : MonoBehaviour
{
public Signal signal;
void Update()
{
if (signal == Signal.Red && Input.GetMouseButtonDown(0))
{
signal = Signal.Green;
Debug.Log("Walk!");
}
}
public bool CanWalk()
{
return signal == Signal.Green;
}
}enum Signal { Red, Yellow, Green } erstellt einen neuen Typ mit genau drei Werten: Signal.Red, Signal.Yellow und Signal.Green. Ein Feld vom Typ Signal enthält immer einen davon; du vergleichst es mit == und änderst es mit =. Ein falsch geschriebenes Signal.Gren verursacht einen Kompilierungsfehler, sodass der Fehler auffällt, bevor du auf Play drückst.
Das enum ist außerhalb der Klasse deklariert, sodass jedes Skript Signal verwenden kann und das Skript eines Fußgängers crossing.CanWalk() abfragen kann. Ein neues enum-Feld beginnt mit dem ersten Wert, hier Red. Im Inspector wird ein öffentliches enum-Feld als Dropdown-Liste seiner Werte angezeigt. Intern wird jeder Wert als Zahl gezählt, beginnend bei 0: (int)Signal.Green ist 2.
Aufgabe
EinfachÜberquere den Boden, ohne die Lava zu berühren. Das GameManager-Singleton und das Skript Lava sind bereits vorhanden; gib dem Spiel seine Zustände.
- Deklariere in
GameManager.csoberhalb der Klasse ein EnumGameStatemit den WertenReady,PlayingundGameOverin dieser Reihenfolge und füge GameManager ein öffentliches Feld vom TypGameStatemit dem Namenstatehinzu. Das Spiel startet im Zustand Ready. - Während sich das Spiel im Zustand Ready befindet, wird es mit der Leertaste gestartet: Der Zustand wird zu Playing und
Go!wird protokolliert. - Lava ruft
HitLava()auf. Während sich das Spiel im Zustand Playing befindet, wird es dadurch beendet: Der Zustand wird zu GameOver undGame overwird protokolliert. Mit der Leertaste kann ein beendetes Spiel nicht neu gestartet werden. - In
Player.csbewegt die Pfeiltasten den Spieler nur, während der Zustand Playing ist.
Drücke auf Play, probiere die Pfeiltasten vor der Leertaste aus, laufe dann in die Lava und klicke anschließend auf Check.
Probier es selbst
using UnityEngine;
// Deklariere hier das GameState-enum: Ready, Playing, GameOver
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
// ein öffentliches GameState-Feld namens state
void Awake()
{
Instance = this;
}
void Update()
{
// Im Zustand Ready startet Space das Spiel und gibt Go! im Log aus
}
public void HitLava()
{
// Im Zustand Playing ist das Spiel vorbei: Gib Game over im Log aus
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Echte Spiele entwickeln
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer4Szenen und Level
Eine Szene ladenDas Level neu startenNächstes LevelZwischen Szenen beibehaltenRückblick: Levelauswahl10Projekt: 3D-Plattformer
Der ParcoursBewegliche Plattformen2Buttons 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