Kursinhalt
Kampfspiel in Unity
Kampfspiel in Unity
Hauptmenü Erstellen
Hauptmenü
Skript für das Hauptmenü
using UnityEngine;
using UnityEngine.SceneManagement;
public class MainUI : MonoBehaviour
{
public void StatTheGame()
{
SceneManager.LoadScene(1);
}
public void Quit()
{
Application.Quit();
}
}
Die Klasse MainUI
ist ein einfaches Skript, das Funktionalität zum Starten des Spiels und Beenden der Anwendung bereitstellt. Dieses Skript ist für die Verwendung mit UI-Buttons in Unity vorgesehen.
Klassendefinition und Methoden
Die Methode StatTheGame
dient dazu, das Spiel zu starten, indem eine neue Szene geladen wird. Genauer gesagt weist SceneManager.LoadScene(1)
Unity an, die Szene mit dem Build-Index 1
zu laden, was ihrer Position in den Build-Einstellungen entspricht.
Die Methode Quit
ermöglicht das Schließen der Anwendung durch Aufruf von Application.Quit()
. Diese Funktionalität ist jedoch nur in einer gebauten Anwendung wirksam und nicht im Unity Editor.
Verwendung in Unity
Anfügen des Skripts
Erstellen eines GameObjects (z. B. ein leeres GameObject oder ein UI-Element).
Das MainUI
-Skript an das GameObject anhängen, indem das Skript darauf gezogen oder die Schaltfläche Add Component
im Inspektor verwendet wird.
Einrichten von UI-Schaltflächen
Erstellen einer UI-Schaltfläche (z. B. GameObject > UI > Button
).
Die Schaltfläche auswählen und zum Inspektor wechseln.
Im Abschnitt On Click ()
auf die Schaltfläche +
klicken, um ein neues Ereignis hinzuzufügen.
Das GameObject mit dem angehängten MainUI
-Skript in das Objektfeld ziehen.
Im Dropdown-Menü MainUI > functionName
auswählen.
Game Manager
Skript für Game Manager
public class GameManager : MonoBehaviour
{
public GameStates GameState { private set; get; }
public static event System.Action<GameStates> onGameStateChanges;
public static GameManager instance;
void Awake()
{
if (instance != null)
{
Destroy(gameObject);
return;
}
instance = this;
DontDestroyOnLoad(gameObject);
}
void Start()
{
GameState = GameStates.Playing;
onGameStateChanges?.Invoke(GameState);
}
public void FinishGame()
{
GameState = GameStates.Finished;
onGameStateChanges?.Invoke(GameState);
}
}
public enum GameStates
{
Playing,
Finished,
}
Die Klasse GameManager
ist für die Verwaltung des Spielzustands verantwortlich. Sie verwendet das Singleton-Muster, um sicherzustellen, dass es nur eine Instanz von GameManager
im Spiel gibt, verwaltet den Spielzustand und sendet Zustandsänderungen über Events.
Klassendefinition und Member-Variablen
Methoden
Awake-Methode
void Awake()
{
if (instance != null)
{
Destroy(gameObject);
return;
}
instance = this;
DontDestroyOnLoad(gameObject);
}
Zweck: Stellt sicher, dass es nur eine Instanz von GameManager
gibt und verhindert, dass diese beim Laden neuer Szenen zerstört wird.
Singleton-Muster: Überprüft, ob bereits eine Instanz existiert. Falls ja, wird das Duplikat zerstört. Andernfalls wird die Instanz zugewiesen und das Objekt so markiert, dass es beim Laden einer neuen Szene nicht zerstört wird.
Start-Methode
void Start()
{
GameState = GameStates.Playing;
onGameStateChanges?.Invoke(GameState);
}
Zweck: Initialisiert den Spielstatus auf Playing
, wenn das Spiel startet, und löst das onGameStateChanges
-Event aus.
FinishGame-Methode
public void FinishGame()
{
GameState = GameStates.Finished;
onGameStateChanges?.Invoke(GameState);
}
Zweck: Setzt den Spielstatus auf Finished
und löst das onGameStateChanges
-Ereignis aus.
GameStates-Enum
public enum GameStates
{
Playing,
Finished,
}
Zweck: Definiert die möglichen Zustände des Spiels.
Gegner reagiert auf Spielstatusänderungen
private void GameManager_onGameStateChanges(GameStates state)
{
if (state == GameStates.Finished)
{
stateManager.ChangeState(idle);
}
}
Diese Methode verarbeitet die Änderungen des Spielstatus. Wenn der Spielstatus auf Finished
wechselt, wird der Zustand des Gegners auf idle
gesetzt.
Abschluss-Panel
Skript für das Abschluss-Panel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.SceneManagement;
public class FinishPanel : MonoBehaviour
{
[SerializeField] Player player;
[SerializeField] GameObject panel;
[SerializeField] TMP_Text infoText;
private void Start()
{
GameManager.onGameStateChanges += GameManager_onGameStateChanges;
}
private void GameManager_onGameStateChanges(GameStates obj)
{
if (obj == GameStates.Finished)
{
panel.SetActive(true);
OnGameFinished();
}
}
void OnGameFinished()
{
if (player.isDead)
{
infoText.text = "You lost";
infoText.color = Color.red;
}
else
{
infoText.text = "You Won";
infoText.color = Color.green;
}
}
public void BackToMainMenu()
{
SceneManager.LoadScene(0);
}
public void Quit()
{
Application.Quit();
}
}
Die Klasse FinishPanel
steuert die Anzeige und Funktionalität des Abschluss-Panels, das erscheint, wenn das Spiel endet. Dieses Panel gibt dem Spieler eine Rückmeldung darüber, ob er gewonnen oder verloren hat, und bietet Optionen, um zum Hauptmenü zurückzukehren oder das Spiel zu beenden.
Erläuterung
Methoden
Start-Methode
private void Start()
{
GameManager.onGameStateChanges += GameManager_onGameStateChanges;
}
Zweck: Abonniert das Ereignis GameManager.onGameStateChanges
, um auf Änderungen des Spielzustands zu reagieren.
GameManager_onGameStateChanges-Methode
private void GameManager_onGameStateChanges(GameStates obj)
{
if (obj == GameStates.Finished)
{
panel.SetActive(true);
OnGameFinished();
}
}
Zweck: Verarbeitet Änderungen des Spielzustands. Wenn der Spielzustand Finished
ist, wird das Abschluss-Panel aktiviert und OnGameFinished
aufgerufen.
OnGameFinished-Methode
void OnGameFinished()
{
if (player.isDead)
{
infoText.text = "You lost";
infoText.color = Color.red;
}
else
{
infoText.text = "You Won";
infoText.color = Color.green;
}
}
Zweck: Aktualisiert den Text des Abschluss-Panels basierend darauf, ob der Spieler tot oder am Leben ist.
Logik: Ist der Spieler tot, wird der Text auf "You lost" in Rot gesetzt. Ist der Spieler am Leben, wird der Text auf "You Won" in Grün gesetzt.
BackToMainMenu-Methode
public void BackToMainMenu()
{
SceneManager.LoadScene(0);
}
Zweck: Lädt die Hauptmenü-Szene (Build-Index 0), wenn sie aufgerufen wird. Diese Methode ist dafür vorgesehen, mit einer Schaltfläche in der Benutzeroberfläche verknüpft zu werden.
Quit-Methode
public void Quit()
{
Application.Quit();
}
Zweck: Beendet die Anwendung, wenn sie aufgerufen wird. Diese Methode ist dafür vorgesehen, mit einer Schaltfläche in der Benutzeroberfläche verknüpft zu werden.
Zusammenfassung
Die FinishPanel
-Klasse zeigt die Endspielergebnisse an und bietet Optionen, um zum Hauptmenü zurückzukehren oder das Spiel zu beenden. Sie abonniert GameManager.onGameStateChanges
, um sich bei Spielende entsprechend zu aktualisieren und verbessert so das Benutzererlebnis durch klare Rückmeldungen und intuitive Auswahlmöglichkeiten.
1. Was passiert, wenn die Methode FinishGame
in der Klasse GameManager
aufgerufen wird?
2. Was passiert, wenn der GameManager
den Spielstatus auf GameStates.Finished
ändert?
Danke für Ihr Feedback!