Jump to content
Unity Insider Forum

Prozedurale Weltgenerierung (2D, Top Down, Tiles)


Mark

Recommended Posts

Howdi,

 

ich habe ein System welches Bereiche in einer 2D Top Down Welt laden/generieren/speichern/entladen kann. Soweit so gut, es funktioniert soweit prima, bis auf den Generierungspart.

 

Aber erstmal ein paar mehr Details:

 

Ich habe meine Welt in Bereiche (Page) und Zellen (Chunks) aufgeteilt. Bereiche bilden die ganzen Tileinformationen ab und die Zellen bilden die eigentlichen Tiles ab die sich aus den Bereichsinformationen ergeben.

 

Ich möchte nun das wenn ein Bereich in den Speicher geladen wird und für diesen Bereich keine Custom Daten vorhanden sind diesen Bereich prozedural generieren.

 

Als Eingangsdaten gibt es:

- die Positionen der einzelnen Tiles in dem Bereich

- das aktuelle Biome (Wüste, Wald, Berg, etc)

- eine Reihe vorher definierter Punkte (besondere Locations wie Städte, Dörfer, Wegpunkte, etc für die Story halt)

 

Ich möchte nun das automatisch zwischen den vorher definierten Punkten Wege und ähnliches generiert wird.

 

Habt ihr da eine Ahnung wie man sowas am besten bewerkstelligt?

 

Meine idee bisher dazu sieht wie folgt aus:

 

Es wird einmalig eine Grobe Karte Generiert die quasi nur Pfade und Co beinhaltet und keine Tiledaten. Sprich: Ein Spline der Stadt A mit Stadt B verbindet, wie Groß Stadt A und b sind, etc.

 

Diese Grobe Karte würde ich dann immer beim generieren eines Bereiches benutzen um herauszufinden was nun diesen Bereich berührt um anhand dessen die Umgebung aufzubauen, also im Wald wird ein Weg entlanggehen, Stadtmauern und Häuser werden generiert etc.

 

Habt ihr da schon was fertiges oder bessere Ideenn?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die wchtigen Elemente setze ich ja schon noch per Hand, aber das ganze drum herum kann man sicher ganz gut per Script generieren lassen ohne das es dabei wie hingerotzt aussieht. Minecraft und Co machen es ja gut vor.

 

Der Wiederspielwert steigt dadurch an und ich kann mir sparen jeden Quadratmeter in einer sehr großen Welt (theoretisch unendlich/Speicherplatz limitierend) per Hand zu setzen (man kann nur x Blümchen per Hand setzen bis es einen ankotzt ;)).

 

Das Terrain Tool hilft mir da leider nur bedingt.

 

Prozedural bleibt daher ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Spiele wie zb Cubeworld generieren ihre Landschaft ja mit Voxeln bzw mit sogenanten Octrees wobei Octrees ja 3D sind. Aber es gibt auch eine 2D Variante das sind nähmlich Marching Squares.

Ich kann dir grob bescheiben wie diese Algorithmen funktionieren vielleicht kannst du diese irgend wie auf deine Verhälnisse umbauen.

Egal ob da nun Marching Cubes 3D oder Squares 2D verwendet werden das prinzip ist das selbe.

 

Als ersten werden zufällig bereiche generiert Octress die einen sehr hohen Bereich haben (Berg) und bereich wo nierig sind. Dann werden die Bereiche zwischen den Octrees gefüllt hierbei wird im Algorithmus immer geschaut wie der Nachbar Postion der Nachbar hat. so werden diese bereiche gefüllt und es entstehen täler berge flüsse etc.

 

Da du dies nun in 2D umsetzen willst wäre denken ich ebenfalls einen Vergleich zum Nachbar gebiet sehr wichtig. Generier eine WÜste einen Wald einen Berg in einem Bestimmten Bereich und generie dann was dazwischen liegt und verbinde die Wüste mit dem Wald usw. Somit hast du auf jedenfall ein Grösseres Gebiet mit einem Wald und nicht nur eine kleine Wüste mit 1qm :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich suche keine Lösung um Meshs zu erzeugen sondern die Welt ansich, prozedurale Weltgenerierung, wie Marching Cubes, etc funktionieren ist mir bereits klar, aber da ich Tiles benutzen möchte für mich irrelevant.

 

Ich empfehle einfach mal den Eingangspost nochmal zu lesen ;)

 

Und tut einfach mal so als wäre ich erfahren ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist schon ein recht schwieriges Thema.

Ich weiss ja nicht genau, wie deine Tiles so sind, hätte aber eine Idee die du vielleicht als Stütze für dein Problem nutzen könntest.

Du kennst doch sicherlich das Brettspiel "Die Siedler von Catan". Dort ist die Welt ja quasi auch mit 6Eckigen Tiles erstellt.

Auf den Tiles sind dann z.B. auch Wege drauf, die von einer Seite eines Tiles zur einer anderen Seite gehen. Es ist aber nicht immer die Gegenüberliegende und somit bekommst du in die Wege schnell eine Varrainz rein. Einzig die Wege müssen immer in der Mitte der Seite raus kommen.

Wenn du jetzt also 2 Städte hätest, die mit einem Spline Verbunden sind, könntest du das Spline als groben Pfad für diese Tiles nehmen. Du müsstest nur immer die Tiles so platzieren, dass die Seite wo der Weg endet an der Seite wo der Weg beginnt liegt.

Sollte durch die zufällige Weganordnung das nächste Tile zu weit vom Spline weg driften, musst du einfach ein felstgelegtes Tile einfügen, wo ein Weg drauf ist, der mehr in Richtung des Splines zeigt.

Hier mal eine quick&dirty-Skizze zu den 6Ecken mit Wegen.

post-21-0-50767600-1387638467_thumb.png

 

So wäre das in etwa.

 

Bei den Städten könntest du vom Zentrum aus nach außen immer andere Tiles nehmen und am Rand der Stadt dann Tiles mit Mauern erzeugen. Dort wo die Stadt an eine Straße führt, wäre dann ein Tor. Wie die Stadt aufgebaut ist, also nach welchem Muster, musst du einmal auswürfeln. Es gibt ja Städte, die rund sind, ekige auf dem Reißbrett erzeugt, Straßen- bzw. Fluß-Städte, die langgezogen sind usw...

Die Landschaftsgenerierung läuft nach Formeln ab. In der Natur ist alles irgendwie in Wellen oder immer wiederkehrenden Verteilungskurven verteilt. Du machst das zwar 2D, aber trotzdem kannst du ja Höheninformationen einbauen. Je nach Höhe gibt es unterschiedliche Vegetation und sogar Gewässer.

 

Tja, vielleicht hilft es dir.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Direkt helfen kann ich dir nicht. Da ich sowas bisher selber auch noch nicht gemacht habe. Zum anderen frage ich mich was du eigentlich genau machen möchtest.

 

Einmal gibt es ja eine komplette Prozedurale Welt. Dort wird dann nahezu alles eben zufällig generiert. In so einem Fall wüste ich aber nicht warum du eine Hauptmap mit wegen haben möchtest. Es ist doch gerade das Ziel das sich eben alles zufällig generiert. Es mal ein Weg entstehen kann, mal eine Stadt, mal nicht. Eben alles zufallsbasiert. Eben so wie bei Minecraft.

 

Ansonsten scheint es mir so das du wahrscheinlich eine Welt Prozedural generieren möchtest. Du allerdings bestimmte Regeln einhalten möchtest. z.B. ein Spieler beginnt auf der Mitte der Karte. Es gibt 3 Wege jeder Weg führt zu einer fest definierten Stadt, aber der Weg zum Ziel soll utnerschiedlich sein und die Welt immer anders sein. Daher ein Mix aus Prozedural und vorgegebenen Sachen? Zumindest glaube ich das aus deiner Beschreibung heraus gelesen zu haben.

 

Ansonsten könntest du solch eine "Master-Map" generieren. Sehe da nichts falsches dran. Was mir ansonsten nur noch einfällt ist wie man diese Master-Map auch eleminieren könnte. Du sagtest ja bereits das du deine Welt in Pages und Chunks einteilst. Ansonsten wenn du eine Page generierst dann muss eine Page auch immer die Werte der direkt umliegenden Pages beachten.

 

Nehmen wir also an du hast eine Page generiert und unten führt ein weg in die Page herein. Und oben geht der Weg aus der Page wieder heraus. Wenn du dann die obere Page darüber generierst dann weis diese page das ein weg unten herein führt. Nun muss diese Page entscheiden was es mit dem Weg machen soll. Es kann beispielsweise entscheiden das der weg sich beendet. In die Stadt führt, oder der weg weiter geführt wird. Wenn es sich sagen wir entscheidet den weg weiter zu führen. Dann muss es sich wieder entscheiden in welcher Richtung der Weg weiter geführt wird.

 

Links, oben oder Rechts. Natürlich kann der weg nur weiter geführt werden in eine andere Page die noch nicht generiert wurde. Wenn es nur noch eine freie page gibt dann ist die entscheidung wohin der weg führen muss dann schon fest, und du musst den weg in die freie page generieren.

 

Ansonsten der weg selber kann ja komplett zufällig innerhalb der page generiert werden. Wichtig ist nur das die übergangspunkte stimmen. Daher wo es rein/raus geht.

 

Ansonsten musst du irgendwann ja deine Stadt generieren. Ansonsten kannst du dem Weg auf deinen Pages ja noch Constraints geben. So das du sagen wir sagst das dieser weg zur Stadt X immer mindestens 10 Pages lang sein muss. Maximal jedoch 20. Ansonsten schleppst du bei jeder Page diese information mit und speicherst wie lange der derzeitige weg ist. Bist du bei 10 angekommen und du generierst deine Page dann lässt du mit einer zufälligen chance, sagen wir zu 25% deine Stadt generieren. Sollte das maximum überschritten sein, dann musst du eben die Stadt generieren in der Page.

 

Ob das jetzt besser ist als deine "Master-Map" kann ich nicht sagen. Vorteil wäre eben nur das du keine Master-Map brauchst und sich jede Page nur um sich selber kümmert und nur einfluss von seinen anliegenden Pages mit einbezieht. Ansonsten muss in diesem Szenario auch nicht zu beginn eine riesiege karte generiert werden sondern die Karte wird Lazy während des Spielens generiert.

 

Ansonsten die Idee das eine Page die Information der umliegenden Pages beachtet würde ich sowieso machen. Da wenn du Biome generierst ich es z.B. für klug halte das man keine Schneelandschaft direkt neben einer wüste setzt und man die Biomes an der Landschaft koppelt. Gerade diese harten Biome übergänge hatte ja auch Minecraft am anfang und das sah eher blöd aus. Mitlerweile haben sie ja einen neuen Welt-Generator der sowas auch verhindert.

 

Ansonsten fällt mir gerade noch ein Video ein. Bei "Sir! You are being Hunted" gab es auch bei der Unite ein Thema zur Prozeduralen Welt und wie man nette Karten erstellt. Ich weiß zwar gar nicht mehr was das Video alles behandelte aber evtl. hilft es dir als Inspiration.

 

 

Eventuell findest du ja noch weitere Informationen von den Entwicklern und paar weitere Anregungen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Meine herangehensweise wäre in etwa so:

Eine Zelle definieren mit einer Story-Location drauf. Diese Zelle hat 1-n Anschlusspunkte.

Von jedem Punkt nun einfach im Loop per Zufall entscheiden:

Soll ich einen Weg machen?

Wenn ja:

Wie lange und in welche Richtung.

Wenn nein:

Soll ich eine Kreuzung machen?

Wenn ja:

Wieviele Ästelungen?( = neue Anschlusspunkte)

Wenn nein:

Soll ich eine weitere Story-Zelle machen?

etc.

pipapo.

Die einzelnen Faktoren kann man dann noch gewichten.

 

So kann man auch vordefinierte Objekte einbinden, da am Ende einfach alle Anschlusspunkte belegt sein müssen.

Natürlich gibt es dann noch einen Shitload von Spezialfällen (Wege (würden) kreuzen ... was tun?)

 

Ich hab das mal in PHP gemacht, da ich so ein Online-Dungeon-Karten-Generator basteln wollte. Bin aber irgendwann abgedriftet und hab dann nur noch schöne Bildchen daraus gemacht... muss das mal wieder raussuchen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo, sorry für die späte Rückmeldung.

 

Ich hab mir alle ideen durchgelesen nd selbst noch weiter überlegt und experimentiere nun ein wenig herum.

 

Bisher verfolge ich diesen Ansatz:

 

Ich unterteile meine Welt weiter und zwar in Bereiche (Quadratische Areale). Jeder Bereich hat eine Position und Größe sowie einen Seed (der sich aus der Position + WorldSeed ergibt).

 

Meine Pages werden nun, wenn sie generiert werden, den Bereich anfordern dem sie untergeordnet sind (ein Bereich deckt viele Pages ab). Dieser Bereich und die direkten Nachbarn dieses Bereiches werden nun folgendes machen:

 

Sie generieren "Gebiete der Interesse" zB Kreisförmige Waldpunkte, Seen, Gewässer, Städte, Berge, etc.

 

Kreisförmige Gebiete können miteinander verbunden werden (Kombinieren wenn Bedingung xy erfüllt ist).

Linienförmige Bereiche (Flüsse, Wege) können ebenso verbunden werden.

 

Ich habe bisher nur Wälder Testweise implementiert, inklusive der super simplen Tile Generierung für ein ganzes Gebiet (stark in der Auflösung eingeschränkt).

 

Später wird dirse Tile Generierung wenn alles wie gedacht läuft die feineren Details ausplanen, zB dass der Wald zum Rand hin lichter wird, Ufer an Gewässern, detailierte Dörfer/Städte, etc.

 

Da alles auf Seeds basiert und die Gebiete die Nachbarareale betrachten kann eine relativ nette zusammenhängende Welt entstehen ohne dass ich die gesamte Welt in grober version vorgenerieren muss, nur das was benötigt wird wird generiert und das reproduzierbar.

 

Der Nachteil ist natürlich dass nur die direkten Nachbarn der Areale in Betracht gezogen werden können, da diese aber rel groß sein können und man hier ein LOD Mechanismus verwenden kann der eine noch größere und gröbere Version generiert oder gar durch vordefinierte Elemente gespeist wird, ist das ganze gut kaschierbar.

 

Space - Neu generieren

Enter - erstellt aus dem Zentralen gebiet eine "Tile screenshot" Textur

https://dl.dropboxus...n/WorldGen.html

 

Das generierne ist noch suuuuper lahm, da 0 Optimierungen eingebaut wurden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

ICh habe das ganze nun so weit dass ich rel große Welten generieren kann, hier mal ein WIP Screenshot:

 

Untitled.png

 

Die roten Punkte sind Siedlungen (bisher nur Kreise) und das gelbe sind Wege zwischen den Siedlungen. Nur die Siedlungen und Wege werden vorher generiert, der Rest ist einfach nur per Simplex Noise gemacht.

 

Was nun noch fehlt ist eine bessere Platzierung der Gewässer, was bisher auch nur Simplex Noise ist und sich ein wenig mit den Wegen stört. Vermutlich werde ich die Gewässer auch vorher generieren so wie die Wege, dies erscheint mir am sichersten zu sein.

 

Folgen wird dann noch das auffüllen ( Mineralien) der noch leeren Berge. Danach werde ich mich mal daran setzen das ganze nicht nur per einzelne Pixel sondern durch echte Tiles darzustellen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gefällt mir schon sehr.

Was natürlich etwas unnatürlich wirkt: Wenn 2 Orte nah neben einander liegen wird vom 3. Ort zu jeder Siedlung ein Weg erzeugt, egal ob die 3/4tel des Weges sogut wie paralell verlaufen.

Da stellt sich die Frage, ob es nicht besser wäre einen Minimalwinkel zu haben, ab dem erst 2 Wege oder aber 2 Abzweigungen erzeugt werden. So 30° würden ganz gut kommen.

Ist nur ne Anregung. :)

Kann mir vorstellen, dass das nicht so leicht umzusetzen ist.

 

Jedenfalls ist dein Ergebnis schon top!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke :)

 

Ja die Wege könnte man noch etwas aufbessern, evtl mache ich das, muss ich mal schauen. Die Wege sieht man eh weiter auseinander da man im Spiel selbst viel näher dran ist als bei der Ansicht die ich gepostet habe, werde es mir aber nochmal näher ansehen hast ja immerhin recht damit :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die einzige Frage die sich mir nur stellt ist was die Grünen und bräunlichen Bereiche darstellen. Grün ist begehbarer Bereich und die Bräunlichen sind berge/unbegehbar? Und neben Grün hast du noch stellen mit etwas dunklem Grünen?

 

Ansonsten gefällt es mir auch. Was mir nur auffällt ist das Speziell in deinem Screen dort 4 Städte relativ nah beinander sind.

 

Ansonsten speziell beim Fluss. Ein Fluss endet ja in der Regel im Meer und macht keine Schleifen oder ähnliches. Hast du auch ein Meer bei dir eingeplant?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Howdi, das dunkelgrüne sind Wälder bzw einzelne Bäume, der Wald nimmt zum Rand hin an Dichte ab, weswegen dieser dort spärlicher besäät ist.

 

Das dunkelrote sind berge bzw einfach Gestein, noch recht trist da dort noch keinerlei besondere Erze oder sowas eingebettet sind.

 

Die Flüsse sind einfach nur differenz Simplex Noise Muster, nix besonderes,m bin mir noch nicht sicher wie ich das ändern werde, vermutlich indem ich einfach die Flüsse so wie die Wege erstelle, ohne Simplex Noise und nach anderen festen wohldefinierten Regeln.

 

Die Städte sehen noch recht nah aus da die Wege so dick erscheinen, wie gesagt der Spieler wird später vieeeeel näher dran sein und dadurch fällt es auch nicht weiter auf. Die mindest Entfernung der Städte ist regelbar, zur Not kann ich das also gut hochdrehen :)

 

Meer ist noch nicht geplant, aber vermutlich ganz brauchbar um die Welt zu begrenzen,

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...