Top-SecreT Geschrieben 27. Dezember 2017 Autor Melden Share Geschrieben 27. Dezember 2017 So aktueller Stand: Sieht schon ganz gut aus. Jetzt überlege ich fieberhaft mit welchem Algorithmus ich das hinkriegen könnte dass er das Wasser verteilt. Also ich habe bis jetzt ein Input wo ich festlegen kann wieviel % der Tiles Wasser-Tiles sein sollen. Dann soll er zufällig eine kleine Anzahl an Startpunkten festlegen also zB 5 Startpunkte für Wasser die aber auch nicht direkt nebeneinander liegen sollen. Um diese Startpunkte sollen dann die restlichen Wasser-Tiles verteilt werden damit es eben Seen oder Flüsse werden. Dazu habe ich eine Funktion die prüft ob in einem bestimmten Radius um ein Feld Wasser-Tiles vorkommen. Er geht dann durch eine Schleife nimmt ein zufälliges x und ein zufälliges y und prüft dann ob der Bereich frei ist und wenn nicht macht er einen neuen Schleifendurchlauf und kriegt dadurch andere Zufallskoordinaten. Wie kann man es aber abfangen dass er 1000 Durchläufe macht weil er kein freies Plätzchen mehr findet? Gibt es da einen effizienteren Weg? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Dezember 2017 Melden Share Geschrieben 27. Dezember 2017 Was du beschreibst klingt wie ein Cluster. Ich denke da gibt es mehrere Methoden einen solchen Cluster zu erzeugen, Ich würde wie du es bereits gemacht hast einen Zufallspunkt auf der Map auswählen und von diesem Punkt aus wird der Cluster erstellt. Beim Erstellen des Clusters würde ich eine Richtung vorgeben (das ist ein Pfad der abgelaufen wird, ist quasi ein Vektor). Dann gibt es folgende Schleifen: in Schleife 1 wird sich entlang des Vektors bewegt in Schleife 2 werden um die aktuelle Position herum kreisförmig Einheiten erzeugt: - es wird von einem minimalem bis zu einem maximalem Radius generiert - da wo frei ist + ggf. noch ein Zufallselement (setzen / nicht setzen) Der Vektor wird nach jedem Durchlauf der Schleife 1 leicht verschoben (damit nicht nur in eine Richtung marschiert wird) Nach einer definierten Anzahl von Durchläufen von Schleife 1 wird das Generieren beendet (Abbruchbedingung) Es gibt vielleicht besserer Methoden einen Cluster zu erzeugen, aber so wurde ich es machen: Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Top-SecreT Geschrieben 27. Dezember 2017 Autor Melden Share Geschrieben 27. Dezember 2017 Das ist ein interessanter Ansatz. Muss ich mal ausprobieren. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Dezember 2017 Melden Share Geschrieben 27. Dezember 2017 Hier ist noch eine Methode für ein Zufallsvektor in einem bestimmten Radius:https://docs.unity3d.com/ScriptReference/Random-insideUnitCircle.html Damit kannst du in der 2. Schleife Zufallspositionen erzeugen und dann den Radius immer weiter erhöhen bis zu einem bestimmten Maximalradius. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Top-SecreT Geschrieben 27. Dezember 2017 Autor Melden Share Geschrieben 27. Dezember 2017 Ja dafür hab ich schon eine eigene Funktion die mir direkt die Iso Grid Koordinaten gibt Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Dezember 2017 Melden Share Geschrieben 27. Dezember 2017 Eine 2. Methode für ein Cluster wäre folgende (iterativer Ansatz): - Zufallspunkt A auswählen auf dem Terrain - 1. Schleife erzeugt eine Wolke von Punkten um Zufallspunkt A (bestimmte Menge) - 2. Schleife iteriert über die Punkte der Schleife 1 und erzeugt ausgehend von den Punkten weitere Wolken - X Iterationen bis Abbruch Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Top-SecreT Geschrieben 27. Dezember 2017 Autor Melden Share Geschrieben 27. Dezember 2017 Ja das ist gut Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Dezember 2017 Melden Share Geschrieben 27. Dezember 2017 Hier Pseudocode ... Verwendung nur mit Vorsicht, wenn die Abbruchbedingung nicht stimmt hängt sich Unity auf ;D void Test() { List<Vector2> pointList = new List<Vector2>();; int numPositions = 5; for (int i = 0; i < numPositions; i++) { Vector2 startPoint = GetRndPointOnMap(); pointList.Add(startPoint); generatePointCloud(startPoint, pointList, 0); } } generatePointCloud(Vector2 startPoint, List<Vector2> plist, int level) { if (level == 4) return; int cloudSize = 10; for (int i = 0; i < cloudSize; i++) { Vector2 newPoint = startPoint + UnityEngine.Random.insideUnitCircle * 5; plist.Add(newPoint); generatePointCloud(newPoint, plist, level + 1); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Dezember 2017 Melden Share Geschrieben 27. Dezember 2017 Hab's doch mal ausprogrammiert, hatte mich auch interessiert wie es dann aussieht using System.Collections; using System.Collections.Generic; using UnityEngine; public class ClusterTest : MonoBehaviour { public Material POIMaterial; private List<Vector2> pointList = new List<Vector2>(); private List<GameObject> goList = new List<GameObject>(); // Use this for initialization void Start () { //GeneratePOIs(); } void Update() { if (Input.GetKeyDown(KeyCode.F1)) { // Clear Scene foreach (GameObject go in goList) { Destroy(go); } GeneratePOIs(); } } void GeneratePOIs() { pointList = new List<Vector2>(); ; int numPositions = 5; for (int i = 0; i < numPositions; i++) { Vector2 startPoint = GetRndPointOnMap(); pointList.Add(startPoint); GeneratePointCloud(startPoint, pointList, 0); } // Draw POIs foreach (Vector2 pp in pointList) { GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); goList.Add(sphere); sphere.transform.position = new Vector3(pp.x, 1.5F, pp.y); sphere.GetComponent<Renderer>().material = POIMaterial; } } Vector2 GetRndPointOnMap() { return new Vector2(Random.Range(0, 45), Random.Range(0, 45)); } void GeneratePointCloud(Vector2 startPoint, List<Vector2> plist, int level) { if (level == 4) return; int cloudSize = 5; for (int i = 0; i < cloudSize; i++) { Vector2 newPoint = startPoint + UnityEngine.Random.insideUnitCircle * 5; plist.Add(newPoint); GeneratePointCloud(newPoint, plist, level + 1); } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Top-SecreT Geschrieben 27. Dezember 2017 Autor Melden Share Geschrieben 27. Dezember 2017 Haha haste dich mal kurz reingesteigert Ja das sollte gehen. Muss ich nur irgendwie sagen wieviele Punkte er pro Startpunkt setzen soll. Wenn zB beim 2. Startpunkt nur noch 1 Tile übrig ist weil dann die 20% Wasser erreicht sind sieht es komisch aus *g* Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Dezember 2017 Melden Share Geschrieben 27. Dezember 2017 Die Anzahl berechnet sich für obigen Code so (ah ist zu spät für solche Berechnungen *g): 5 * 5 (level 0) + 5 * 5 (level 1) + 5 * 5 (level 2) + 5 * 5 (level 3) + 5 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Top-SecreT Geschrieben 27. Dezember 2017 Autor Melden Share Geschrieben 27. Dezember 2017 Ok jetzt komm ich nicht mehr mit Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Dezember 2017 Melden Share Geschrieben 27. Dezember 2017 Da ist die Berechnung für die Anzahl der POIs (point of interest) also die Anzahl der Tiles die erzeugt werden anhand des obigen Codes. Dieses Bild wurde mit: numPositions = 10; // (Anzahl der Spots) int cloudSize = 5; // (Größe der Wolke) if (level == 4) return; // (Anzahl der Iterationen) erzeugt. Man kann schöne Muster damit erzeugen, also die Methode funktioniert gut: Ich hör lieber auf, sonst mach ich Unity wieder kaputt Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Top-SecreT Geschrieben 27. Dezember 2017 Autor Melden Share Geschrieben 27. Dezember 2017 Ich guck mir das morgen nochmal an. Für heute qualmt mir der Kopf ^^ Sieht auf jeden Fall sehr gut aus. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 27. Dezember 2017 Melden Share Geschrieben 27. Dezember 2017 vor 15 Minuten schrieb Top-SecreT: Ich guck mir das morgen nochmal an. Für heute qualmt mir der Kopf ^^ Sieht auf jeden Fall sehr gut aus. Gute Nacht Du darfst nur nicht so hohe Werte verwenden wie ich, auf deiner Tilemap hast du ja nicht so viel Platz... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Top-SecreT Geschrieben 29. Dezember 2017 Autor Melden Share Geschrieben 29. Dezember 2017 Also ich werd mich der Zufallsgenerierung später widmen. Ich ahne dass ich zu schnell die Lust am Projekt verlieren könnte dadurch. Ich gehe erstmal über einen Map Editor den ich heute aufgebaut habe und die Zufallsgenerierung behalte ich mir als Feature vor Als nächstes werd ich mich dem Speichern und Laden der Maps widmen. Ich will ja irgendwann mal in den spannenden Bereich mit den Einheiten kommen *g* Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 29. Dezember 2017 Melden Share Geschrieben 29. Dezember 2017 Ist denke ist auch besser so, kleine Maps sollte man vermutlich besser von Hand erstellen (über einen Editor) zumal man bei einer niedrig auflösenden Map generierter Content ggf. seltsam aussehen könnte. Ist wie bei Pixel-Sprites, die sollte auch von Hand erstellen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 16. Januar 2018 Melden Share Geschrieben 16. Januar 2018 Na, was macht dein Projekt ? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Top-SecreT Geschrieben 16. Januar 2018 Autor Melden Share Geschrieben 16. Januar 2018 Viel weiter ist es noch nicht. Ich hab erstmal in Ruhe die GUI für den Map Editor gebaut. Und bis ich herausgefunden habe dass es Toggle Groups gibt hab ich schon 1 Woche dran rumprobiert wie ich es machen kann dass der Button nach Klick angewählt bleibt Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.