2015-12-23 5 views
0

У меня есть простой скрипт spawner в игре Unity, который должен создать экземпляр врага, а затем подождать несколько секунд до того, как будет разыгран другой враг. Для этого я создал совместную программу с использованием WaitForSeconds, но когда я запускаю игру, все враги появляются сразу. Что меня смущает, так это то, что я написал в некоторых журналах Debug сообщение о времени до выполнения WaitForSeconds и времени после WaitForSeconds. Журналы отладки показывают, что правильное количество времени прошло, но все враги создаются мгновенно, поэтому между экземплярами явно нет ожиданий. Время между икру устанавливается с помощью инспектора в едином движке, и поэтому «TimeBetweenSpawns» в настоящее время установлен на 10 секунд, чтобы сделать его очевидным, если время действительно ждет. Сценарий ниже:WaitForSeconds, похоже, меняет time.time, но на самом деле не ждет

using UnityEngine; 
using System.Collections; 

public class TESTspawner : MonoBehaviour { 

    //PUBLIC VARIABLES 
    public GameObject Enemy; 
    public int NumberOfEnemies; 
    public int NumberOfWaves; 
    public int TimeBetweenSpawns; 
    public int TimeBetweenWaves; 
    public Transform SpawnPoint; 
    //PRIVATE VARIABLES 
    private int EnemyCount = 0; 
    private int WaveCount = 0; 

    //Wait Co-routine 
    IEnumerator Wait(int x){ 
     Debug.Log ("Wait Time start: " + Time.time); 
     yield return new WaitForSeconds(x); 
     Debug.Log ("Wait Time end: " + Time.time); 
    } 

    // Use this for initialization 
    void Start() { 

    } 

    // Update is called once per frame 
    void Update() { 
     if(WaveCount < NumberOfWaves){ 
      if(EnemyCount < NumberOfEnemies){ 
       Instantiate(Enemy, SpawnPoint.position, Quaternion.identity); 
       EnemyCount++; 
       StartCoroutine(Wait(TimeBetweenSpawns)); 
      }else{ 
       StartCoroutine(Wait (TimeBetweenWaves)); 
       WaveCount++; 
      } 
     } 
    } 
} 

EDIT

я удалил сопрограмму и сменил его на использование гораздо более простой переменного таймер. Этот код теперь работает точно так, как предполагалось.

using UnityEngine; 
using System.Collections; 

public class TESTspawner : MonoBehaviour { 

    //PUBLIC VARIABLES 
    public GameObject Enemy; 
    public int NumberOfEnemies; 
    public int NumberOfWaves; 
    public int TimeBetweenSpawns; 
    public int TimeBetweenWaves; 
    public Transform SpawnPoint; 
    //PRIVATE VARIABLES 
    private int EnemyCount = 0; 
    private float SpawnTimer; 

    // Use this for initialization 
    void Start() { 

    } 

    // Update is called once per frame 
    void Update() { 
     if(EnemyCount < NumberOfEnemies){ 
      SpawnTimer += Time.deltaTime; 
      if(SpawnTimer >= TimeBetweenSpawns){ 
       Instantiate(Enemy, SpawnPoint.position, Quaternion.identity); 
       EnemyCount++; 
       SpawnTimer = 0; 
      } 
     } 
    } 
} 
+0

Вы попробовали? –

+0

Я не пробовал ваше решение, потому что я исправил проблему без использования сопрограммы. См. Мое редактирование на исходный вопрос. – lucasRHCP

+0

Ну, в этом случае сопрограмма менее дорогостоящая, чем обновление :) –

ответ

0

Почему вы используете Coroutine в Update? Вы можете настроить свой Coroutine так, как вы его называете один раз.

void Start() 
{ 
    StartCoroutine("Wait"); 
} 

IEnumerator Wait(){ 
    while(EnemyCount < NumberOfEnemies){ 
     if(EnemyCount < NumberOfEnemies){ 
      Instantiate(Enemy, SpawnPoint.position, Quaternion.identity); 
      EnemyCount++; 
      yield return new WaitForSeconds(TimeBetweenSpawns); 
     } 
     else{ 
      yield return new WaitForSeconds(TimeBetweenWaves); 
      WaveCount++; 
     } 
    } 
} 
Смежные вопросы