【发布时间】:2019-06-26 00:26:31
【问题描述】:
我正在尝试为我正在创建的自上而下的游戏创建波浪生成器。我已经创建了 wave spawner 脚本,但是当我点击播放时,什么也没有发生。倒计时没有开始。理想情况下,它应该从 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);
}
【问题讨论】:
-
derHugo 已经为您提供了一个可靠的答案,但是关于为什么什么都没发生的 TLDR:
state被初始化为SpawnState.COUNTING和countDown被初始化为2f所以除非您进行一些调整对于检查器中的序列化值,Update()中的if条件都不是真的。 -
另外,您的 WAITING 状态实际上永远不会等待。如果状态为 not SPAWNING,则将状态设置为 SPAWNING 并生成。
-
Foggzie 和 Draco18s - 感谢您的帮助...我对脚本进行了更改,现在它可以正常工作了。