Jump to content
Unity Insider Forum

Gedanken zur Isometrischen Map mit Unity


Top-SecreT

Recommended Posts

So aktueller Stand: 

scene.PNG.ab013b273dc84b1ef2da99b4e9369e8d.PNG

 

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

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:


IwuhY9c.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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

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);
        }
    }
}


uYnRKoy.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:
vkllve3g.png

Ich hör lieber auf, sonst mach ich Unity wieder kaputt ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

  • 3 weeks later...

Archiviert

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

×
×
  • Neu erstellen...