-
Notifications
You must be signed in to change notification settings - Fork 0
Aufbau Funktionalität
Um den Ausgrabungsprozess zu simulieren startet Troja als eine Ruine. Es ist dann Ziel des Spiels die Stadt durch Ausgrabungen (Minigames) zu rekonstruieren.
Das setzen wir um in dem für jedes Gebäude ein aufgebautes und ein ruiniertes Model existiert. Das Building
Skript erhält eine Referenz auf beide und wechselt sie, wenn das Minigame gespielt wurde.
Also, die Stadt startet so:
Jedes Gebäude hat eine buildingGroupId
und zwei Models für ruinierten und gebauten Zustand. Standardmäßig wird das Ruinen Model benutzt.
Wird ein Gebäude geklickt wird das Minigame der entsprechenden Gebäudegruppe gestartet. Wenn dieses durchgespielt wurde, markiert der immer geladene CityState
die Gebäudegruppe als "bereits gespielt" und bietet eine Methode an um diesen Zustand abzufragen.
public class CityState : MonoBehaviour
{
public static CityState Instance;
public List<BuildingGroup> buildingGroups;
public MinigameEventChannelSO loadMinigameEventChannel;
private readonly Dictionary<int, bool> _buildingGroupState = new(); // Zustand der Gebäudegruppen
...
public bool IsBuildingGroupBuilt(int groupId)
{
return _buildingGroupState.ContainsKey(groupId) && _buildingGroupState[groupId];
}
...
public void OnMinigameSuccess(MinigameSO minigame) // EventListener auf MinigameSuccessEvent_Channel
{
var groupId = State.Instance.MinigameParams.groupId;
_buildingGroupState[groupId] = true;
}
}
Nachdem das Minigame gespielt wurde wird die Levelszene wieder komplett neu geladen. Wie in Architektur erklärt bleibt der CityState
über diese Szenenwechsel bestehen, aber der Rest der Levelszene wird neu geladen. Deshalb kann das Building
beim Start überprüfen, ob seine Gebäudegruppe gebaut wurde, und sein Model entsprechend anpassen.
public class Building : MonoBehaviour
{
public int buildingGroupId;
public Mesh ruinMesh;
public Mesh builtMesh;
private void Start() // wird aufgerufen wenn neu geladen
{
if (CityState.Instance.IsBuildingGroupBuilt(buildingGroupId)) // checkt ob die building group bereits durchgespielt ist
{
OnBuildingGroupBuilt(buildingGroupId);
}
}
...
public void OnBuildingGroupBuilt(int groupId)
{
if (buildingGroupId == groupId)
{
GetComponent<MeshFilter>().mesh = builtMesh; // ersetzte das Standard Ruinen Model mit dem fertig gebauten
}
}
}
Am Ende siehts dann etwa so aus: