Menu
CoddyTech

Zum Zustand wechseln

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

Jeder Zustand eines Spiels führt in jedem Frame unterschiedliche Aufgaben aus. Ein switch für das Zustandsfeld ordnet diese Aufgaben jeweils einem Fall pro Zustand zu, und in jedem Frame wird genau ein Fall ausgeführt. Zustandsänderungen erfolgen über eine Methode, sodass der Bildschirm immer zum Zustand passt. Dieser Bosskampf hat eine Einleitung, den Kampf und einen Sieg-Bildschirm:

public enum Phase { Intro, Fight, Won }

public class BossFight : MonoBehaviour
{
    public GameObject introPanel;
    public GameObject fightPanel;
    public GameObject winPanel;
    public int bossHp = 10;
    private Phase phase;
    private float timer = 3f;

    void Start()
    {
        Enter(Phase.Intro);
    }

    void Update()
    {
        switch (phase)
        {
            case Phase.Intro:
                timer -= Time.deltaTime;
                if (timer <= 0f) Enter(Phase.Fight);
                break;
            case Phase.Fight:
                if (bossHp <= 0) Enter(Phase.Won);
                break;
            case Phase.Won:
                break;
        }
    }

    void Enter(Phase next)
    {
        phase = next;
        introPanel.SetActive(next == Phase.Intro);
        fightPanel.SetActive(next == Phase.Fight);
        winPanel.SetActive(next == Phase.Won);
    }
}

Jeder Fall endet mit break, weil C# einen Fall, der in den nächsten übergeht, nicht kompilieren kann. Wenn der Timer der Einleitung abläuft, ändert Enter(Phase.Fight) die Phase, aber der Fall Fight wird erst im nächsten Frame ausgeführt, weil dieser Frame seinen Fall bereits ausgewählt hat. Bei separaten if-Blöcken direkt hintereinander könnte ein Frame den Kampf starten und den Kampfcode noch im selben Frame ausführen.

Enter ist der einzige Ort, an dem phase geändert wird. next == Phase.Fight ist nur für das Kampffeld true, sodass ein Aufruf dieses Feld einblendet und die anderen beiden ausblendet. Aufgaben, die zum Eintritt in einen Zustand gehören, etwa das Zurücksetzen eines Timers, kommen ebenfalls in Enter und werden einmal statt in jedem Frame ausgeführt.

challenge icon

Aufgabe

Einfach

Ein Tipp-Wettlauf: Wie oft kannst du in 5 Sekunden die Leertaste drücken? Der GameManager hat das Enum GameState (Ready, Playing, GameOver), ein Panel für jeden Zustand, und Start ruft SetState(GameState.Ready) auf. Schreibe Update und SetState.

Schalte in Update abhängig von state um:

  • Ready: Die Leertaste startet eine Runde. Dieser Tastendruck zählt nicht als Tipp.
  • Playing: Jeder Druck auf die Leertaste addiert 1 zu taps und zeigt den Wert in tapsText als Taps: 3 an. Nach roundTime Sekunden (5) ist das Spiel vorbei.
  • GameOver: Die Leertaste führt zurück zu Ready.

SetState(GameState next) setzt state und zeigt nur das Panel des neuen Zustands an. Beim Wechsel zu Playing startet eine Runde mit 0 Tipps, Taps: 0 auf dem Bildschirm und noch roundTime Sekunden; beim Wechsel zu GameOver wird das Ergebnis in resultText als Taps: 3 angezeigt.

Drücke Play, bestreite den Wettlauf zweimal und klicke dann auf Check.

Probier es selbst

using UnityEngine;
using TMPro;

public enum GameState { Ready, Playing, GameOver }

public class GameManager : MonoBehaviour
{
    public GameObject readyPanel;
    public GameObject playPanel;
    public GameObject gameOverPanel;
    public TMP_Text tapsText;
    public TMP_Text resultText;
    public float roundTime = 5f;
    public GameState state;
    private int taps;
    private float timeLeft;

    void Start()
    {
        SetState(GameState.Ready);
    }

    void Update()
    {
        // Je nach state verzweigen:
        // Ready: Space startet eine Runde
        // Playing: Space zählt einen Tipp; wenn die Zeit abgelaufen ist, ist das Spiel vorbei
        // GameOver: Space kehrt zu Ready zurück
    }

    void SetState(GameState next)
    {
        state = next;
        // Nur das Panel des neuen Zustands anzeigen
        // Eine neue Runde beginnt mit 0 Tipps und roundTime Sekunden; am Ende zeigt resultText die Anzahl der Tipps an
    }
}
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 Echte Spiele entwickeln