2016-11-17 2 views
2

Also habe ich das eine Weile gegoogelt, aber ich weiß nicht wirklich, wonach ich suchen soll, also werde ich euch alle nette Leute um Hilfe bitten.Einheit: Feinde auf einer prozedural generierten Karte erscheinen

Ich arbeite an einem prozeduralen Level Creator für mein erstes Spiel. Ein Teil des Codes ist durch das Tutorial hier inspiriert, aber ich versuche so viel wie möglich alleine zu machen. Wie auch immer, hier ist der Code, den ich mit Hilfe benötigen, die wahrscheinlich hässlich wie die Hölle ist, und ich werde erklären, was ich brauche Hilfe mit nach:

Vector3 RandomPosition() 
{ 
    int randomIndex = Random.Range (0, gridPositions.Count); 

    Vector3 randomPosition = gridPositions [randomIndex]; 

    gridPositions.RemoveAt (randomIndex); 

    return randomPosition; 
} 


void LayoutObjectAtRandom (GameObject[] tileArray, int minimum, int maximum) 
{ 
    int objectCount = Random.Range (minimum, maximum); 

    for (int i = 0; i < objectCount; i++) 
    { 
     Vector3 randomPosition = RandomPosition(); 

     GameObject tileChoice = tileArray [Random.Range (0, tileArray.Length)]; 

     Instantiate (tileChoice, randomPosition, Quaternion.identity); 
    } 
} 

void spawnTomcats() // Figure out a way to use the RandomPosition to exclude used tiles in enemySpawn 
{ 
    int enemyCount = (int)Mathf.Log (level, 2f); 

    for (int i = 0; i < enemyCount; i++) 
    { 
     Vector3 enemySpawn = new Vector3 (columns + (Random.Range (0, 5)), rows - (Random.Range (7, 14)), 0f); 

     GameObject tileChoice = enemyTiles [Random.Range (0, enemyTiles.Length)]; 

     Instantiate (tileChoice, enemySpawn, Quaternion.identity); 
    } 

public void SceneSetup (int level) 
{ 
    BoardSetup(); 
    InitialiseList(); 
    spawnTomcats(); 

    LayoutObjectAtRandom (impassableObjects, impassableCount.minimum, impassableCount.maximum); 

    Instantiate (heatCat, new Vector3 (columns - 8, rows - (Random.Range(7, 14)), 0f), Quaternion.identity); 
} 
} 

Also, was ich brauche, ist für „Vector3 enemySpawn“ wählen eine Kachel innerhalb der angegebenen Parameter, die jedoch noch nicht von der Instanziierung von unpassierbaren Objekten in der SceneSetup-Funktion verwendet wird. Alles funktioniert auf dem Laichteil, aber meine "Tomcats" spawnen manchmal auf unpassierbaren Objekten. Ich habe versucht, die RandomPosition() -Methode auf verschiedene Arten zu integrieren, war aber nicht wirklich erfolgreich.

Wenn Sie weitere Informationen benötigen, wie meine Variablen, lassen Sie es mich wissen! Ich bin nicht wirklich sicher, wie viel benötigt wird, da ich noch ein Anfänger bin.

Jeder Ratschlag wird sehr geschätzt.

Joel Crosby.

+0

Wenn meine Antwort hilft bitte vergessen Sie nicht, es als akzeptiert zu markieren, wenn nicht, lassen Sie mich wissen, und ich werde –

+0

Ich habe nicht und werde es nicht vergessen. Ich will nur, dass es richtig funktioniert, damit ich meine Lösung zur gleichen Zeit posten kann. Dein Post hat mir gerade genug Perspektive gegeben, um es selbst auszuarbeiten, also danke ich dir dafür. –

Antwort

1

Ihre beste Wette ist wahrscheinlich, eine List<Vector3> ImpassibleObjects zu pflegen und zu überprüfen, bevor Sie einen neuen Tomcat instanziieren. Vermutlich auch ein bisschen Platz um ihn herum.

Etwas entlang der Linien von:

foreach (Vector3 impLoc in ImpassibleObjects) 
{ 
    if (randomPosition - impLoc < threshold) 
    { 
      CalculateNewRandomPositionAndRecheck(); 
    } 
} 

funktionieren sollte, viel Glück!

+0

Habe einen Tag damit verbracht, es richtig zu machen, aber ich kann es nicht wirklich verstehen. Ich habe versucht, eine Liste objectPositions, und dann objectPositions.Add (randomPosition) direkt oberhalb von gridPosition.RemoveAt() in der RandomPosition() -Methode, aber ich bekomme nicht, wie man ObjektPositionen gegen FeindSpawn messen. Egal, was ich mache, es bringt einfach nichts hervor. Ich bin ein Gestrüpp, ich weiß. –

+0

Um die Entfernung zwischen zwei 'Vector3's zu erhalten, nehmen Sie einfach den absoluten Wert von einem, der vom anderen subtrahiert wird. Deine "Schwelle" sollte von dir bestimmt werden und sollte etwas größer sein als der Radius eines Kreises, der dein unpassierbares Objekt enthält. Es ist dann eine einfache Sache zu überprüfen, dass Ihr neuer Laichplatz nicht innerhalb der Schwelle von irgendwelchen Gegenständen in Ihrer Liste ist. Es kann mir helfen herauszufinden, was schief läuft, wenn Sie Ihren neuen Code anhängen. –

Verwandte Themen