2016-08-10 4 views
1

In Einheit möchte ich, wenn das Spiel beginnt, dass die Feinde an einem zufälligen Spawnpunkt spawnen (Ich machte 3 Spawn-Punkte im Spiel), aber die Feinde nicht bei einem der spawn die Punkte.Unity2d: Feinde spawnen nicht zufällig spawnpoint

was habe ich falsch gemacht?

Hier ist mein Code:

UnityEngine verwendet wird; mit System.Collections;

public class WaveSpawner : MonoBehaviour { 

public enum Spawnstate {SPAWNING, WAITING, COUNTING }; 

[System.Serializable] 
public class Wave 
{ 
    public string name; 
    public Transform enemy; 
    public int count; 
    public float rate; 

} 

public Wave[] waves; 
private int nextWave = 0; 


public float timeBetweenWaves = 5f; 
public float waveCountdown; 

public Transform[] spawnPoints; 

private float searchCountdown = 1f; 

private Spawnstate state = Spawnstate.COUNTING; 

void Start() 
{ 
    if (spawnPoints.Length == 0) 
    { 
     Debug.LogError("No spawn points referenced"); 
    } 
    waveCountdown = timeBetweenWaves; 
} 

void Update() 
{ 
    if(state == Spawnstate.WAITING) 
    { 
     if(!EnemyIsAlive()) 
     { 
      WaveCompleted(); 
     } 
     else 
     { 
      return; 
     } 
    } 

    if(waveCountdown <= 0) 

    { 
     if(state != Spawnstate.SPAWNING) 
     { 
      StartCoroutine(SpawnWave(waves[nextWave])); 
     } 

    } 
    else 
    { 
     waveCountdown -= Time.deltaTime; 
    } 
} 

void WaveCompleted() 

{ 
    Debug.Log("Wave Completed!"); 

    state = Spawnstate.COUNTING; 
    waveCountdown = timeBetweenWaves; 

    if (nextWave + 1 > waves.Length - 1) 

    { 
     nextWave = 0; 
     Debug.Log("Completed all waves!"); 
    } 

    else 
    { 
     nextWave++; 
    } 



} 

bool EnemyIsAlive() 
{ 
    searchCountdown -= Time.deltaTime; 
    if (searchCountdown <= 0f) 
    { 
     searchCountdown = 1f; 
     if (GameObject.FindGameObjectWithTag("Enemy") == null) 
     { 
      return false; 
     } 
    } 
    return true; 
} 


IEnumerator SpawnWave(Wave _wave) 
{ 
    Debug.Log("Spawning Wave: " + _wave.name); 
    state = Spawnstate.SPAWNING; 

    for(int i = 0; i < _wave.count; i++) 
    { 
     SpawnEnemy(_wave.enemy); 
     yield return new WaitForSeconds(1f/ _wave.rate); 
    } 

    state = Spawnstate.WAITING; 


    yield break; 
} 

void SpawnEnemy(Transform _enemy) 

{ 
    Debug.Log("Spawning Enemy: " + _enemy.name); 


    Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length) ]; 
    Instantiate(_enemy, transform.position, transform.rotation); 

} 
} 

enter image description here

Antwort

0

versuchen Vielleicht

Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length) ]; 
Instantiate(_enemy, transform.position, transform.rotation); 

um so etwas wie

Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length-1) ]; 
Instantiate(_enemy, _sp.position, _sp.rotation); 
+0

Dank zu ändern Mann, es funktioniert jetzt! – JordiDragon

+2

Kein Problem. Wie von Rian erwähnt, war Ihr Code anfällig für IndOutOfRance außer. Auch die Transformation, die Sie übergeben haben, war nicht die Transformation, die Sie von Ihrem zufälligen Spawnpunkt-Parsing zurückgegeben haben – MKougiouris

1

Random.Range kehrt inclusive Bereichswerte, um 0 bis 5 enthalten könnte 0 und 5

Array-Index Null ist und so basiert Array mit 5 Elementen haben würde 0 bis 4.

Also in Ihrem SpawnEnemy Methode, wenn Sie anrufen

spawnPoints[ Random.Range (0, spawnPoints.Length) ] 

Wenn Random.Range bereitstellt, wird es fehlschlagen.

Ändern es zu

spawnPoints[ Random.Range (0, spawnPoints.Length-1) ] 

Sollte Ihr Problem beheben.

Verwandte Themen