我在Unity游戏中有一个简单的spawner脚本,它应该实例化一个敌人,然后在产生另一个敌人之前等待几秒钟。要做到这一点,我使用WaitForSeconds设置一个协同例程,但是当我开始游戏时,所有敌人立刻产生。令我困惑的是,我写了一些调试日志,发布执行WaitForSeconds之前的时间和执行WaitForSeconds之后的时间。调试日志显示已经过了适当的时间但是所有的敌人都是立即创建的,所以实例化之间显然没有等待。产生之间的时间是使用Unity引擎中的检查器设置的,因此'TimeBetweenSpawns'当前设置为10秒,以便在实际等待时间时显而易见。脚本如下:
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;
}
}
}
}
修改
我已经删除了协同例程并将其交换为使用更简单的计时器变量。此代码现在完全按预期工作。
moderator
答案 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++;
}
}
}