Враг, порождающий волну единства - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь создать создателя волн для нисходящей игры, которую я создаю.Я создал скрипт Wave Spawner, но когда я нажимаю кнопку play, ничего не происходит.Обратный отсчет не начинается.В идеале он должен начинаться с 2, как только он достигнет 0, первая волна должна появиться с одним врагом.Как только этот враг убит, отсчет должен начинаться с 5, а после достижения 0 начинается следующая волна с 2 врагами и так далее.Новая волна не должна начинаться, пока все текущие враги не будут уничтожены.

public enum SpawnState { SPAWNING, WAITING, COUNTING };

public SpawnState state = SpawnState.COUNTING;

public Transform enemy;

public float timeBetweenWaves = 5f;
public float countDown = 2f;

private int waveIndex = 0;

public float searchCountdown = 1f;   

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

  if (countDown <= 0f)
  {          
      if (state != SpawnState.SPAWNING)
      {              
          StartCoroutine(SpawnWave());
          countDown = timeBetweenWaves;
      }
      else
      {              
          countDown -= Time.deltaTime;
      }

  }

}

void WaveCompleted()
{        
    state = SpawnState.COUNTING;
    countDown = timeBetweenWaves;
    SpawnWave();        
}

bool EnemyisAlive()
{        
    searchCountdown -= Time.deltaTime;
    if (searchCountdown <= 0)
    {
        searchCountdown = 1f;
        if (GameObject.FindGameObjectsWithTag("Enemy").Length == 0)
        {
            return false;
        }
    }
    return true;
 }

IEnumerator SpawnWave()
 {        
    state = SpawnState.SPAWNING;
    waveIndex++;
    for (int i = 0; i < waveIndex; i++)
    {
        SpawnEnemy();
        yield return new WaitForSeconds(0.5f);

    }
    state = SpawnState.WAITING;
    yield break;
 }

void SpawnEnemy()
 {
    Instantiate(enemy, transform.position, transform.rotation);
 }   

1 Ответ

2 голосов
/ 25 июня 2019

Я бы порекомендовал вам использовать сопрограмму для всего этого.Это делает некоторые вещи проще.Например, вы можете просто подождать, пока другой Ienumertaor не закончится.Затем я просто добавил бы появившихся врагов в список, отфильтровал его для null записей и использовал счетчик.Используя Find или в вашем случае FindGameObjectsWithTag каждый кадр крайне неэффективен!

using System.Linq;
using System.Collections.Generic;

...

public Transform enemy;

public float timeBetweenWaves = 5f;
public float countDown = 2f;

//public float searchCountdown = 1f; 

private List<Transform> enemies = new List<Transform>();
private int waveIndex = 0;

private void Start()
{
    StartCoroutine(RunSpawner());
}

// this replaces your Update method
private IEnumerator RunSpawner()
{        
    // first time wait 2 seconds
    yield return new WaitForSeconds(countDown);

    // run this routine infinite
    while(true)
    {
        state = SpawnState.SPAWNING;    

        // do the spawning and at the same time wait until it's finished
        yield return SpawnWave();

        state = SpawnState.WAITING;

        // wait until all enemies died (are destroyed)
        yield return new WaitWhile(EnemyisAlive);

        state = SpawnState.COUNTING

        // wait 5 seconds
        yield return new WaitForSeconds(timeBetweenWaves);
    }
}

private bool EnemyisAlive()
{        
    // uses Linq to filter out null (previously detroyed) entries
    enemies = enemies.Where(e => e != null).ToList();

    return enemies.Count > 0;
}

private IEnumerator SpawnWave()
{        
    waveIndex++;
    for (int i = 0; i < waveIndex; i++)
    {
        SpawnEnemy();
        yield return new WaitForSeconds(0.5f);
    }
}

private void SpawnEnemy()
{
    enemies.Add(Instantiate(enemy, transform.position, transform.rotation));
}

Чтобы быть немного более эффективным, вы также можете избежать создания и уничтожения экземпляров, а вместо этого использовать Объединение объектов - только включение и отключение объектов и, в конечном итоге, появление новых только при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...