У меня есть простой скрипт 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;
}
}
}
}
Вы попробовали? –
Я не пробовал ваше решение, потому что я исправил проблему без использования сопрограммы. См. Мое редактирование на исходный вопрос. – lucasRHCP
Ну, в этом случае сопрограмма менее дорогостоящая, чем обновление :) –