Tag/Nacht Zyklus - globale Variable

  • Hey :bye:


    Ich hänge ein bisschen fest bei meinem Projekt, was den Tag/Nacht Zyklus angeht. Ich habe mir ein Tutorial darüber angeschaut und es nachgebaut. Es funktioniert auch soweit wunderbar. Abends wird es dunkel, Mond und Sterne sieht man. Feuer gehen bei Dunkelheit überall an und irgendwann geht die Sonne wieder auf. Das ganze ist nicht nur animiert, sondern hat einen richtigen Tag/Nacht Zyklus mit Jahre/Monate/Tage/Stunden/Minuten/Sekunden. Das funktioniert alles sehr gut und ich werde das Tutorial auch in diesen Post verlinken.

    Nun zu meinem Problem:

    Die gesamte Welt in meinem Spiel besteht aus mehreren Maps. Wenn ich jetzt z.B. vom Untergrund an die Erdoberfläche zurück reise und dabei eine neue Map geladen wird, fängt dieser Zyklus von vorne an. Wenn ich also bei Nacht rein gehe und direkt wieder raus, ist es auf einmal 12 Uhr Mittags. Ich habe mir schon Tutorials angeschaut, wie man globale Variable erstellt, werde aber aus denen gerade nicht schlau und weiß auch nicht, wie ich das in diesen Zyklus integrieren soll. Wahrscheinlich ist das ziemlich einfach. Das Skript muss bestimmt irgendwie global gespeichert werden, so das die Zeit auch außerhalb der Map weiter läuft. Wie das ganze funktioniert ist mir noch ein Rätzel.

    Vielleicht hat von euch jemand einen Tipp, kennt ein gutes Tutorial oder so etwas selbst schon mal gemacht und teilt sein wissen?

    Tutorial Tag/Nacht Zyklus:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Blueprint vom Tag/Nacht Zyklus:

  • Es gibt verschiedene Methoden, um Variablen an Maps weiterzugeben. Eine globale Variable im eigentlichen Sinne gibt es nicht, also wie bei Desktopanwendungen oder so. Es sei denn, bei der 5er ist irgendetwas hinzugekommen.

    Eine Möglichkeit ist zum Beispiel über Usersettings, so habe ich es letztes Mal gemacht, ist allerdings auch schon ein Jahr her, vielleicht gibt es da auch bessere Möglichkeiten.

    Aber, das Prinzip ist eigentlich folgendes. Das Speichern von Usersettings ist nicht auf Einstellungen wie Grafik, Sound etc. beschränkt. Du kannst auch kurzfristig Variablen speichern und diese dann nach dem Mapwechsel wieder auslesen.

    P.S., was ich noch nicht ausprobiert habe, was aber vielleicht auch funktionieren könnte, solltest du die Maps asynchron laden, könnte es vielleicht auch mit einem Interface funktionieren. Aber wie gesagt, habe ich noch nicht ausprobiert.

    • Offizieller Beitrag

    Hey eine Variable gilt immer nur für das Level das gerade geladen ist. Sobald du das Level neu Lädst wird auch die Uhrzeit neu geladen. DIe Uhrzeit an ein anderes Level zu übertragen ist eine Möglichkeit.

    Was ist aber wenn du ein Multiplayer haben willst ? Dann hätte jeder Player seine eigene Uhrzeit und theoretisch seine eigenen Tag/Nacht Zyklen. Was ja gar nicht möglich wäre.


    Was meiner Meinung nach besser wäre auch wenn wenn du kein Multiplayer implementieren willst: Es gibt eine Globale Uhrzeit.


    Was du dir auch überlegen solltest: Was passiert wenn du das spiel speicherst und dass Spiel verlässt ? Läuft die Uhrzeit weiter wenn du aus dem Spiel draußen bist oder soll die Uhrzeit gespeichert werden und weiter laufen sobald du wieder im Spiel bist ?


    Das Schlüsselwort was du suchst, ist Gameinstanz. Eine Gameinstanz, ist eine Klasse die dazu dient, Daten und Logiken zu verwalten die über verschiedene Level hinausgehen.


    Auf Youtube findest du dazu viele Tutorials.

  • Stimmt. Gameinstanz hatte ich ganz vergessen zu erwähnen. Allerdings hatte ich damit ein paar Probleme, weswegen ich es damals über die Settings gelöst hatte. Aber wie gesagt, das war schon etwas her, kann auch sein, dass diese Probleme nicht mehr auftauchen. Damals hatte die Gameinstanz irgendwie Random Variablenwerte vergessen. Kann logischerweise aber auch sein, dass ich da etwas falsche gemacht hatte.

  • Ich habe mich ein wenig mit der GameInstanz beschäftigt und zumindest ein Verständnis dafür bekommen, wie das funktioniert. Leider habe ich noch nicht herausgefunden, wie ich den Zyklus dort hin übertrage. Im Grunde müssen ja nur die Variablen in der GameInstanz angelegt werden und dann muss man im Hauptskript auf die Variable mit CastToGameInstanz verweisen. Bei jeder Variablen aber ein CastTo... zu setzen finde ich ganz schön wirr. Da gibt es bestimmt auch eine bessere Lösung. Oder kann man den kompletten Skript einfach in der GameInstanz schreiben und dann im Hauptskript einen Verweis setzen, dass die Funktion aus der GameInstanz gelesen wird?

    Mir wird auch bewusst, dass ich vieles aus meinem Spiel nochmal neu aufsetzen muss, da ich bisher leider nicht bedacht habe, dass wenn ich das Level neu lade, auch alle Türen, die ich geöffnet habe, Lichter, die ich angemacht habe, etc wieder auf null gesetzt werden. Das sollte ja möglichst vermieden werden. Es sollte ja alles so aufzufinden sein, wie man es verlassen hat, wenn kein NPC damit interagiert hat. Das lässt sich dann mit Sicherheit auch über die GameInstanz steuern.

  • Ja, das Savegame kann auch zu einem ziemlichen Ar*chloch werden, besonders wenn man feststellt, dass etwas nicht in der Planung inbegriffen war.

    Aber, kümmern wir uns erstmal um diene Instance. Es kommt ja drauf an, wie du die Daten verarbeitest. Wenn du ein spezielles Ereignis auslöst, kannst du zum Beispiel auch sehr gut mit Interfaces zugreifen. Allerdings, der Standard ist dann doch eher CastTo, was ich dir auch empfehlen würde.

    Auf gar keinen Fall solltest du die komplette Routine in die Instance packen. Nicht nur, weil die Instance dafür gar nicht ausgelegt ist, sie hat in Sachen Events ja auch einige Einschränkungen, du gewinnst ja auch nichts dadurch. Denn du musst ja noch immer das Event, welches von deiner Spielfigur ausgelöst wurde, an die Instance übertragen. Von daher stehst du spätestens dann wieder vor dem gleichen Problem, wenn du es dann nicht sogar noch verstärkt hast.