Levelstream in ein Savegame Speichern - Landscapes

  • Guten Morgen,


    ich habe im Persistant Level einen Prozedualen Levelgenerator gebastelt. Jetzt werden die ganzen Instancen ins Persistant rein geladen. Gibt es eine möglichkeit sie in einen Array zu laden und diesen dann zu speichern? Man möchte ja nicht in einem Spielstand immer eine andere Map bekommen.


    Persistant Map -> Generate Map

    - instancen der Unter-Maps werden zufällig aneinander gereiht


    Generierte Map --> Savegame



    Wäre toll wenn ihr eine Lösung für mich habt *dead*



    Unbenannt


    Das möchte ich gespeichert haben wenn die Welt generiert ist...

    2 Mal editiert, zuletzt von Dalek () aus folgendem Grund: Foto Hinzegefügt

  • Da keiner antwortet Versuch ich mal ☺

    Endlich..,. Ein Mensch... Und er antwortet :D


    Über einen Seed habe ich nachgedacht. Aber mein Wissen reicht noch nicht aus denke ich um das umzusetzen. :/ Dann bräuchte man nur ne Zeichenfolge speichern. Das stimmt.

  • Ich habe versucht jeden Wert in einen Array zu speichern. Jedoch wenn ich das Game lade spuckt mir zum Beispiel der Transform nur einen Wert aus. Habe es zumindest geschafft, dass er an der richtigen stelle auftaucht. Aber das Bringt mir nichts, wenn die anderen Level nicht auftauchen...

    • Offizieller Beitrag

    Ich befürchte dass.das zu viel zum speichern und laden wird. Keine Ahnung was du vorhast aber das sind ja nicht nur Positionen die.speichern müsstest.


    Schau dir mal ne Caesar Algorithmus an vielleicht kannst du aus dem einen Schlüssel basteln.


    Mindcraft setzt in auf Voxel die .durch eine feste Formel generiert werden.

  • Schau dir mal ne Caesar Algorithmus an vielleicht kannst du aus dem einen Schlüssel basteln.


    Mindcraft setzt in auf Voxel die .durch eine feste Formel generiert werden.

    Ein Algorithmus? Das klingt voll kompliziert. Denke nur mit C++ umsetzbar oder? Habe davon gestern auch was gelesen.

  • mein Ziel ist es halt eine prozedural generierte welt in ein savegame zu speichern. Aktuell wird meine Welt durch das o.g. Tutorial generiert.


    Zumindest hat er mir beim LoadSavegame nach dem ForEachLoop mit nem PrintString alle Werte ausgespuckt. Jedoch glaube ich, dass Die Welt zu schnell generiert wird weshalb bei mir zwar Die Welt wieder generiert wird, aber er lädt halt nur eine Welt. Immer die selbe.


    Es wird ja zum zufälligen generieren ein RandomInteger verwendet. Hinterher soll es ja nicht random sein. Also womit könnte man eine Reihenfolge in einem Get(Array) als Index festlegen?

    • Offizieller Beitrag

    Ein Algorithmus? Das klingt voll kompliziert. Denke nur mit C++ umsetzbar oder? Habe davon gestern auch was gelesen.

    Ich weiß nicht wie deine Generierung funktioniert aber vermutlich werden ja irgend welche Werte Random erzeugt oder ?


    Ich bin nun auch kein Profi was derartige dinge angehen aber rein von der Logik her hast du zwei Möglichkeiten:


    1. Du Generierst ein Level zufällig und musst nach der Generierung jede sehr viele Werte speichern und Laden.

    So hast du es ja im Moment.


    2. Du generierst dein Level mit einem Festen Schlüssel (Einer Formel) der Algorithmus dafür muss ja auch nicht kompiziert sein. Wichtig ist nur das immer das selbe Level dabei rauskommt. Dadurch sparst du dir das gesamte Speichern des levels und musst das Level einfach nur nach dem Seed neu generieren. Alles was du geändert hast auf die alte Position setzen und fertig.


    Das sollte sich auch über Blueprints und ohne C++ lösen lassen.

  • 2. Du generierst dein Level mit einem Festen Schlüssel (Einer Formel) der Algorithmus dafür muss ja auch nicht kompiziert sein. Wichtig ist nur das immer das selbe Level dabei rauskommt. Dadurch sparst du dir das gesamte Speichern des levels und musst das Level einfach nur nach dem Seed neu generieren. Alles was du geändert hast auf die alte Position setzen und fertig.


    Das sollte sich auch über Blueprints und ohne C++ lösen lassen.


    Also im Grunde funktionier meine map so:


    Es wird ein Raster für die Anordnung der Maps erzeugt und ein RandomInteger den Jeweiligen Levelnamen gettet den dann das Create Instance bekommt. Hier mal ein Bild:


    Unbenannt
    image host


    Es passiert alles zeitgleich per Tastendruck.



    Für deinen zweiten Punkt hätte ich etwas im Kopf was ich versuchen könnte. In dem der Seed aus mehreren stellen besteht und jede Zahl ist ein index des Levelname-Arrays. Aber wie kann ich aus einer langen Zahl nur eine Stelle entnehmen? Das brauchte ich noch nie. Aber würdest du dieser Theorie zustimmen? :sleepy: (Jede Zweite Zahl steht dann zum Beispiel für die Rotation die ja auch random ist)


    Wie genau man einen Algorythmus erstellt wüsste ich jetzt nicht. :/

    • Offizieller Beitrag

    Bei einem Grid muss ja dein Teilstück nur in X und Z Richtung addiert werden. oder ?

    Ist teil Teilstück also 1m * 1m Groß, dann muss dein ersten teil auf xyz = 0,0,0 dein zweites auf xyz = 2,0,0

    Also in X Richtung um 2 Verschoben und das selbe eben mit Z usw.


    Mal angenommen du hättest 255 unterschiedliche teile. Ein Byte hat 255 Zustände. Von 0 -255 könntest du also alle Teile als Zahl in einem Byte speichern.

    0 = "Eine Kurve

    1 = " Eine Gerade"

    2. = Eine Weiche" usw


    Das Byte könnte zb so aussehen: 012012012 Heißt also Kurve, Gerade, Weiche, usw.


    So: Nun speicherst generierst du einfach dein Grid mit den Objekten und vergibst den teilen eine zufällige Zahl zwischen 0 und 2- so ist irgend was zwischen Kurve und Weiche möglich. Die Möglichkeiten kannst du wie gesagt bis auf 255 Zustände ausbauen und braucht dafür nur ein Byte.


    Welches Mesh dann verwendet wird, hängt dann davon ab welche zufällige Zahl das jeweilige Grid stück bekommen hat.


    Somit brauchst du nur noch die Reihenfolge der Zufalls Zahlen in X und Z Richtung speichern und die könntest dann auch in einem Array speichern .


    Im Prinzip wie ein Schachbrett A1 A2 A3 usw


    Wäre das eine Idee ?

  • Boah ich muss das mal ganz kurz sacken lassen. =O Also ich verwende ja Landscapes und die lassen sich leider nicht in einem Actor platzieren.. Also mooment ich muss da mal kurz drüber nachdenken...

  • Ein Byte hat 255 Zustände. Von 0 -255 könntest du also alle Teile als Zahl in einem Byte speichern.


    Also ich denke das dürfte kein Geheimnis sein, dass ich noch mit meinen 25 jahren am lernen bin und teilweise noch rum experimentieren muss... In der Unreal Engine versteht sich. ^^ Aber ich weiß nicht genau was ein Byte macht.


    Value-Range sagt mir was. Von-Bis. Aber wie genau ich den verwende. Finde auch nichts genaues im www. (Suche auch auf Englisch). Aber irgendwie ist da der Wurm drin.

  • Warum ?


    Kannst mal ein Screenshot posten wie dein Terrain im Moment mit dem Zufalls Generator aussieht ?


    Das macht doch nicht wirklich Sinn.

    Unbenannt


    Da ist er gerade noch am generieren. Er reiht halt die Maps aneinander und die beinhalten die landscapes. Der Übersicht wegen mit verschiedenen Texturen erstmal.

  • UFF: Was hast du den genau vor ?


    Kommt mir so vor als würdest du Unreal hier übelst vergewaltigen.


    Oha warum? Ist halt n random Levelstream. Und in jedem Levelstream ist ein Landscape. Habe gehört das soll wohl nicht so Leistungsfressend sein wie Meshes zu verwenden. Könnte allerdings auch Landscape Meshes anfertigen und dann in nen Actor laden. Dachte aber damit würde ich dann unreal vergewaltigen.

    • Offizieller Beitrag

    Habe gehört das soll wohl nicht so Leistungsfressend sein wie Meshes zu verwenden.

    Ja aber nur wenn man es richtig einsetzt.


    1. Terrain VS Mesh.


    Wenn du ein Gebiet mit einer Größe von 1024 * 1024 m haben möchtest, dann bräuchtest du bei einem Mesh eine 1024 * 1024 px große Textur. Dann hättest du genau ein Pixel pro m²

    Selbst bei einer 4096 px Textur wäre die Pixel dichte einfach zu gering.

    Terrains hingegen nutzen Vertex Paint, alle Texturen zb eine Wiesen Textur wird einfach unendlich oft wiederholt. Hast du mehre Materials für dein Terrain wie zb Wiese, Erde, Stein usw so werde diese durch den Pinsel aufgetragen. Dann ist aber nicht ganz richtig den in Wirklichkeit wird nicht das Material aufgemalt sondern eine Maske. Du definierst also an welche Stelle an deinem Terrain welches Material sichtbar sein soll. Diese Maske ist nun aber keine auf Pixel basierende Map und basiert auf Vertex Paint.

    Im Prinzip werden werden die Masken als Positions (dots) gespeichert.

    Durch diesen Trick ist man bei den Texturen völlig unabhängig was die Resolution angeht. (Texturen muss halt kachelbar sein)


    Es macht also durchhaus Sinn ein riesiges Terrain auf Heightmap Basis zu verwenden damit man keine Riesige Textur braucht. DIe Beton liegt auf ein riesiges Terrain und nicht hunderte. Da ist die Performance dann futsch.


    2.Terrains werden tesseliert.


    Terrains kann man in sehr sehr hoher detalreiche darstellen. Das liegt daran weil ein Terrain Tesseliert wird. Das Heißt: Ein Terrain ist Technisch gesehen flach wie eine Flunder. Nur da wo der Spieler hinschaut wird das Terrain zu einem Berg, Tal etc aufgehäuft.


    Hast du also ein Terrain, macht das Sinn weil immer nur der sichtbare Bereich in 3D dargestellt wird. Hast du viele Terrains, dann müssen je nach Sichtbarkeit auch mehre Terrains in 3D dargestellt werden.


    Im groben: Ein Terrain statt ein Mesh zu verwenden macht absolut Sinn.

    aber

    Viele Terrains statt einem Terrain zu verwenden macht wiederum weniger Sinn.


    Nicht ohne Grund werden bei Minecraft zb Voxels verwendet. Voxel sind auch nicht einfach nur Cubes so wie viele immer gerne Denken. Sondern Voxel sind komplexe Mathematische Formenln mit dehnen man Voxel Terrains sehr performant darstellen kann.


    UNd noch was wo du berücksichtigen solltest:

    Terrains sind zwar performanter wie Meshes. Aber durch das Culling werden auch immer du soviele Meshes angezeigt wie der Spieler sehen kann. (Camera Occlusion Culling)


    Du könntest sicherlich ohne Probleme einige Tausend Planes (ähnlich deiner Landscapes) als Mesh anzeigen. Einfach unterschiedliche Terrains per Zufall aneinander zu reihen sieht bei mehren male doch auch sehr statisch und langweilig aus ? Ich glaube man wird immer erkennen dass es Random ist,

  • 2.Terrains werden tesseliert.


    Im groben: Ein Terrain statt ein Mesh zu verwenden macht absolut Sinn.

    aber

    Viele Terrains statt einem Terrain zu verwenden macht wiederum weniger Sinn.


    Ah vielen Dank für die Erklärung. Da erklärt denke auch warum die meisten Prozedualen Games pixelig aussehen. Mir fällt nur NoMansSky ein was da besser dargestellt wird.


    Jedoch erklärt es mir nicht ganz wie ich vorgehen sollte. Habe jetzt verstanden: 1 Landscape gut.. mehrere Landscapes nix gut.


    Dann wäre es also performanter Voxel zu verwenden was jedoch sehr aufwendig sein soll.


    Du sagtest es würde auffallen bei mir wenn ich Die Welt so generiere. Naja nicht unbedingt weil die eine random Rotation haben und die Masse machts.


    Ich muss jetzt denke das gesamte System überdenken. Aber einen Anhaltspunkt habe ich noch nicht so wirklich. :/ Voxel sind ja schon etwas heavy.

    • Offizieller Beitrag

    Dann wäre es also performanter Voxel zu verwenden was jedoch sehr aufwendig sein soll.

    Ja ein Voxel Terrain ist natürlich der Hammer. Bei NomansSky, Sevendays to die usw wird ebenfalls ein Voxel Terrain verwendet.


    Ein anderer Nachteil von Terrains ist auch das man mit einem Terrain keine Höhlen und Cliffs darstellen kann.

    In Spielen wird hier meist eine Mesh/Terrain Mischung verwendet.


    Du sagtest es würde auffallen bei mir wenn ich Die Welt so generiere. Naja nicht unbedingt weil die eine random Rotation haben und die Masse machts.

    Sorry das glaube ich nicht.


    Mal eine kleine Information am Rande:

    Ein Comnputer egal welcher selbst ein Quanten Computer kann keine Zufallszahlen generieren. Das ist einfach nicht möglich. Es Prinzip kommen bei einem durch den Computer erstellte Zufallszahl immer das selbe Ergebnis raus. Das ist einfach Formel bedingt.

    Syntax: Fange an zu zählen/Stop nach Zeitpunkt X

    Nur wann ist der Zeitpunkt X erreicht ?


    Gelöst wurde das Problem in dem man das Ergebnis zb mit der aktuellen Zeit multipliziert.


    Aber selbst wenn du 50 Zustände durch durch Zufall generieren lässt, wird ´man die Wiederholungen sehen.

    Ist doch bei Terrain Texturen auch so. Selbst bei einer 4k Map sieht man die Widerholungen.


    Glaub mir das ist Amdahl`s Law soviel Performance kannst du niemals aufwenden. Sowas wird in der Spiele Entwicklung meist nur durch Tricks erreicht.


    Zufall ist niemals Zufall den Zufälle gibt es in der PC Welt nicht.

  • Ja ein Voxel Terrain ist natürlich der Hammer. Bei NomansSky, Sevendays to die usw wird ebenfalls ein Voxel Terrain verwendet.


    Naja wenn ich sehe, dass das Voxel Plugin 300 Moneten kostet wird mir schwindelig. Das heißt ja automatisch dass es extrem viel Arbeit war. Sieht auch sehr aufwendig aus. Und an tutorials finde ich nur ein MinecraftLike Voxel Tarrain.


    Hast du eine einfachere Lösung eine Welt zu generieren?


    Ziel ist es, dass eine Welt generiert wird die der Spieler auch speichern kann. Wahrscheinlich wird es halt auf einen Seed hinaus laufen. Aber es geht darum eine Handgemachte scheint mir inzwischen einfacher zu bewerkstelligen :D war erst anderer meinung.. aber eine generierte erhöht den wiederspielwert.