-
Notifications
You must be signed in to change notification settings - Fork 0
Architektur
Unsere Architektur setzt sich aus zwei Schichten zusammen.
Zuerst haben wir die BaseScene
. Diese Szene ist immer geladen und hält und verwaltet globalen Zustand. Darunter befindet sich die Szene die aktuell sichtbar ist. Optionen sind Hauptmenu, Levelszenen und Minigameszenen.
Wie oben erwähnt ist die BaseScene immer geladen. Die aktive Szene wird nebenher ausgewechselt, aber die BaseScene bleibt gleich. Das ist perfekt um globalen Zustand zu verwalten, deshalb befinden sich hier Clippy, ein SceneLoader
, StateManager
und das Artefaktbuch.
Der SzeneLoader ist dafür zuständig die aktive Szene durchzuwechseln, wenn zum Beispiel ein Minigame gestartet wird, oder zum Hauptmenu zurückgekehrt werden soll. Umgesetzt ist er Skript Assets/Scripts/Base/SceneLoader.cs
, und das GameObject hält Listener für die Channel
MinigameSuccessEvent_Channel
LoadMinigameEventChannel
LoadLevelEventChannel
LoadMenuEventChannel
Außerdem feuert er Events in den MinigameSceneUnloadedEvent_Channel
.
Der StateManager verwaltet den im State
Singleton gehaltenen Zustand:
public class State
{
...
public MinigameSO ActiveMinigame;
public MinigameParams MinigameParams;
public SceneReference ActiveLevel;
...
}
Dafür hält er Listener für die Eventchannel:
LoadMinigameEventChannel
MinigameSceneUnloadedEvent_Channel
LoadMenuEventChannel
LoadLevelEventChannel
Wird ein Level gestartet, hält der Zustand eine Referenz auf das aktuell aktive Level.
Wird ein Minigame gestartet, hält der Zustand das aktive Minigame und seine Parameter. Das Minigame greift auf diese auch über den Zustand zu.
Umgesetzt ist der StateManager im Skript Assets/Scripts/Base/StateManager.cs
Die aktive Szene ist die, die gerade zu sehen ist und mit welcher der Spieler interagiert. Zu Start des Spiels natürlich das Hauptmenu.
Unser Hauptmenu zeigt ein Bücherregal mit Büchern die unsere Level Troia I-IX repräsentieren. Klickt man eines der Bücher startet das entsprechende Level.
In der Levelszene sieht man das ruinierte Troia. Die Aufgabe ist nun, es wieder aufzubauen. Dafür kann man auf die Gebäuderuinen klicken und ein Minispiel spielen. Schafft man es, baut sich das Gebäude wieder auf.
Wird ein Minispiel gestartet ersetzte diese Szene die Levelszene komplett. Deshalb enthält die Levelszene ein DontDestroyOnLoad GameObject auf welchem das CityState
Skript den aktuellen Zustand des Levels speichert. Dieses GameObject bleibt erhalten wenn die Levelszene zerstört und wieder geladen wird. Hier ist zum Beispiel definiert für welche Gebäudegruppen welches Minispiel gespielt wird:
Die Gebäude besitzen ein Building
Skript, welches sie einer Gebäudegruppe zuweist und wenn geklickt den CityState
das entsprechende Minispiel starten lässt.
Wird ein Minispiel gestartet, ersetzt die Minigameszene die Levelszene. Minigames sind dann frei wie sie Zustand halten und generell funktionieren während sie aktiv sind. Wenn sie fertig gespielt sind, werfen sie ein Event im MinigameSuccessEvent_Channel
, wodurch der SceneLoader die Szenen wieder wechselt.