Skip to content

Aufbau Funktionalität

DidiSkywalker edited this page Oct 27, 2022 · 3 revisions

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:
Screenshot der Stadt als Ruine

Jedes Gebäude hat eine buildingGroupId und zwei Models für ruinierten und gebauten Zustand. Standardmäßig wird das Ruinen Model benutzt.
Screenshot des Building Inspektors

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:
Screenshot der Stadt mit einem gebauten Gebäude

Clone this wiki locally