Jump to content
Unity Insider Forum

Random Dungeongenerator


Aquana

Recommended Posts

Hallo liebe community,

Ich versuche mir zur Zeit einen Random Dungeongenerator zu machen. So wie ich ihn mir vorstelle. Bisher klappt das größtenteils ganz gut. Doch es gibt da ein kleine Problem. Es werden manchmal an der gleichen Stelle 2-3 Räume erstellt und das macht für mich absolut keinen Sinn. Die Räume sind für den Test übrigens 10x,10y,10z(Unityeinheiten oder welche Angabe man dafür verwendet) groß.

Ich erkläre erst einmal wie ich mir das vorgestellt habe.

1. Ich erzeuge einen Vector 0,0,0. Für eine Startposition. Dort wird das Object ("Erschaffer")auf dem das Script ist gesetzt, solange die boolean "erstesmal" Noch aktiv ist. Die boolean ist dazu da weil erst nach dem ein Raum erstellt wurde auch weitere Spawnpoints erzeugt werden.  

2.Spawnpoints remove ist erst einmal solange die boolean aktiv ist unwichtig (das kommt dann) Danach wird in eine List (Raumposition) die Position des aktuellen Raums gespeichert.Jetzt wird dort der Raum hin erzeugt.

 

3. Über die If-abfragen, die nachfragen sollten ob das Gebiet daneben schon mit einem Raum besetzt ist oder nicht , wird  ein ein Spawnpoint gesetzt oder eben nicht. Also wenn zum Beispiel nur ein Raum existiert sollten 4 Spawnpoints um ihn herum entstehen. Über dem Raum, unter dem Raum und Links und rechts vom Raum. 

Bei Zwei Räumen die nebeneinander stehen ( einer links und einer rechts) sollten dann jeweils oben und unten 2 SPawnpoinst entstehen und nur eine ganz links und der andere ganz rechts.

Dann wird die boolean noch auf false gesetzt. Und die Whileschleife beginnt von neuem.

4.DIesmal sollte Int ZUfall eine zufällig existierende Position in der Spawnpointliste wählen. Dann wird die Position des (Erschaffers ) auf diese Stelle gesetzt.

Jetzt sollte noch die aktuelle Spawnpointposition wieder aus der List entfernt werde, damit es nie wieder auf diese Stelle portet.

Dann wird da wieder eine Raumposition gesetzt, damit dann unten bei der if-abfrage abgefragt wird ob da überhaupt noch ein SPwanpoint auftauchen darf. Wenn zum Beispiel der (Erschaffer) rechts von einem schon existierenden Raum steht.Dann sollte dadurch links kein SPawnpoint in die LIst hinzugefügt werden dürfen.

Natürlich wird wieder ein Raum erzeugt. Und die If-abfragen die ich eben erwähnte beginnen von neuem. Dann geinnt das ganze wieder von vorn. 

5. Jetzt wird wieder eine zufällige Spawnpointposition ausgesucht. Jetzt dürfte aber nie eine ausgesucht werden auf der bereits ein Raum ist. Da die ja bereits schon gelöscht werden, wenn der (Erschaffer) auf dieser Position steht.

 

Dennoch kommt es immer wieder vor das Räume doppelt oder 3-fach auf einem Feld existieren. Das will mir aber nicht in den Kopf. EIgentlich sollte immer nur ein Raum auf ein Stelle existieren.

public  List <Vector3>Raumposition ;
    
   public List <Vector3> Spawnpoints;
    public GameObject Raum;
    
    bool erstesmal = true;
    int raumschleife =0;
    public int Raumanzahl = 10;

 

 

    void Start()
    {


        while (raumschleife < Raumanzahl) // schleife um Anzahl der Räume zu bestimmen
        {
            if (erstesmal)      // Um einen ersten Startpoint zu setzte
            {

                Spawnpoints.Add(new Vector3(0, 0, 0));

                transform.position = Spawnpoints[0];
            }

            if (erstesmal == false) // sobald der zweite durchlauf beginnt
            {
                int zufall = Random.Range(0, Raumposition.Count);     
                transform.position = Spawnpoints[zufall];             // setzte Position auf einen existierenden spawnpoint
            }

            Spawnpoints.Remove(transform.position);          // entferne spawnpoint um zu verhindern das hier wieder ein Raum erschaffen wird

           

 

            Raumposition.Add(transform.position);       // füge Raumposition der lIste zu um es für die untere If-abfrage zu verwenden

 

            
            Instantiate(Raum, transform.position, transform.rotation); // kreiere Raum
     

 

            if (!Raumposition.Contains(new Vector3(transform.position.x + 10, transform.position.y, transform.position.z)))      // es soll nur passieren wenn hier noch ein Raum ist
            {

                Spawnpoints.Add(new Vector3(transform.position.x + 10, transform.position.y, transform.position.z));                  // setzte einen spawpoint neben den Raum bei den 3 weitern if-abfragen das                                                                                                                                                                                                                                   //gleiche
     
             
            }


            if (!Raumposition.Contains(new Vector3(transform.position.x - 10, transform.position.y, transform.position.z)))
            {
                Spawnpoints.Add(new Vector3(transform.position.x - 10, transform.position.y, transform.position.z));
    
         
            }


            if (!Raumposition.Contains(new Vector3(transform.position.x, transform.position.y, transform.position.z + 10)))
            {
                Spawnpoints.Add(new Vector3(transform.position.x, transform.position.y, transform.position.z + 10));
       
          
            }


            if (!Raumposition.Contains(new Vector3(transform.position.x, transform.position.y, transform.position.z - 10)))
            {
                Spawnpoints.Add(new Vector3(transform.position.x, transform.position.y, transform.position.z - 10));
 
        
            }
       
            erstesmal = false;   // wird nicht mehr benötigt nach erstem Durchgang

            raumschleife++; // beginne Schleife von vorn
        }
    }

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe den Code nicht komplett analysiert, da er sehr etwas unübersichtlich ist, aber folgende 2 Zeilen sind eine potentielle Fehlerquelle:

    int zufall = Random.Range(0, Raumposition.Count);     
    transform.position = Spawnpoints[zufall];             // setzte Position auf einen existierenden spawnpoint

Sobald die Längen beider Listen unterschiedlich sind führt dies vermutlich zu Effekten die du so nicht wolltest, also ich denke du wolltest zufall hier auf die Größe von Spawnpoints setzen:

    int zufall = Random.Range(0, Spawnpoints.Count);     
    transform.position = Spawnpoints[zufall];             // setzte Position auf einen existierenden spawnpoint

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...