2016-08-10 3 views
1

В единстве я хочу, когда игра начнется с того, что враги появятся на случайном спавном месте (я сделал 3 точки появления в игре), но враги не появляются на одном из точки.Unity2d: враги не будут появляться на произвольной основе. Spawnpoint

какой я сделал неправильно?

Вот мой код:

использованием UnityEngine; с использованием 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

ответ

0

Может быть, попытаться изменить

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

к чему-то вроде

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

Благодаря человеку он работает сейчас! – JordiDragon

+2

Нет проблем. Как уже упоминал Райан, ваш код был склонен к IndOutOfRance Except. Также преобразование, которое вы проходили, не было преобразованием, которое вы вернули из вашего случайного разбора точки появления – MKougiouris

1

Random.Range возвращает значения диапазона включительно, так что от 0 до 5 может включать в себя 0 и 5.

Индекс массива равен нулю, так и на основе массива с 5 элементов будет иметь от 0 до 4.

Так что в вашем методе SpawnEnemy при вызове

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

Если Random.Range предоставляет spawnPoints.Length, это не удастся.

Изменение его

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

Если устранить проблему.