IEnumerator 在使用它每 0.5 秒产生一个敌人时保持统一崩溃
IEnumerator keeps crashing unity when using it to spawn an enemy ever 0.5 seconds
我知道这通常意味着某处存在无限循环,但我已将其缩小到此 IEnumerator,因为当我删除它时,它工作正常,但会同时生成所有敌人。这个想法是它计算出该波需要多少敌人,然后每 0.5 秒生成 1 个敌人,直到达到该数量,而不是一次为该波生成所有敌人。
更新方法:
void Update()
{
Enemies = GameObject.FindGameObjectsWithTag("EndlessKnife");
NoOfEnemies = 0;
foreach (GameObject Enemy in Enemies)
{
NoOfEnemies++;
}
if (NoOfEnemies == 0)
{
waveNumber++;
StartingAmount = Mathf.RoundToInt(waveNumber + (Mathf.Pow(1.2f, waveNumber)));
for (int i = 0; i < StartingAmount;)
{
if (Limit == false)
{
SpawnEnemy();
i++;
Limit = true;
StartCoroutine(GradualSpawn());
}
}
}
}
IEnumerator:
IEnumerator GradualSpawn()
{
yield return new WaitForSeconds(0.5f);
Limit = false;
}
我使用相同的逻辑来限制我的武器的射速,所以不明白为什么它会在这里崩溃,任何输入都是有帮助的:D
for 循环意味着您希望所有敌人都在同一帧上生成(您不这样做),因为 for 循环将在 int i 小于您的 StartingAmount 时继续执行。如果你想在一段时间内生成敌人,只需使用 if 语句而不是 for 循环:
int i = 0;
if (i < StartingAmount) {
if (Limit == false) {
SpawnEnemy();
i++;
Limit = true;
StartCoroutine(GradualSpawn());
}
}
现在应该可以了:)
你的问题是你被困在这里if (Limit == false)
。您需要稍微重组代码,以便所有等待和循环都发生在协程中,否则您的程序将阻塞。
if (NoOfEnemies == 0){
waveNumber++;
StartingAmount = Mathf.RoundToInt(waveNumber + (Mathf.Pow(1.2f, waveNumber)));
StartCoroutine(GradualSpawn(StartingAmount));
}
然后在你的协程中
IEnumerator GradualSpawn(int StartingAmount)
{
for (int i = 0; i < StartingAmount; i++){
SpawnEnemy();
yield return new WaitForSeconds(0.5f);
}
}
这应该每 0.5 秒产生一个敌人。
希望这有帮助
我知道这通常意味着某处存在无限循环,但我已将其缩小到此 IEnumerator,因为当我删除它时,它工作正常,但会同时生成所有敌人。这个想法是它计算出该波需要多少敌人,然后每 0.5 秒生成 1 个敌人,直到达到该数量,而不是一次为该波生成所有敌人。
更新方法:
void Update()
{
Enemies = GameObject.FindGameObjectsWithTag("EndlessKnife");
NoOfEnemies = 0;
foreach (GameObject Enemy in Enemies)
{
NoOfEnemies++;
}
if (NoOfEnemies == 0)
{
waveNumber++;
StartingAmount = Mathf.RoundToInt(waveNumber + (Mathf.Pow(1.2f, waveNumber)));
for (int i = 0; i < StartingAmount;)
{
if (Limit == false)
{
SpawnEnemy();
i++;
Limit = true;
StartCoroutine(GradualSpawn());
}
}
}
}
IEnumerator:
IEnumerator GradualSpawn()
{
yield return new WaitForSeconds(0.5f);
Limit = false;
}
我使用相同的逻辑来限制我的武器的射速,所以不明白为什么它会在这里崩溃,任何输入都是有帮助的:D
for 循环意味着您希望所有敌人都在同一帧上生成(您不这样做),因为 for 循环将在 int i 小于您的 StartingAmount 时继续执行。如果你想在一段时间内生成敌人,只需使用 if 语句而不是 for 循环:
int i = 0;
if (i < StartingAmount) {
if (Limit == false) {
SpawnEnemy();
i++;
Limit = true;
StartCoroutine(GradualSpawn());
}
}
现在应该可以了:)
你的问题是你被困在这里if (Limit == false)
。您需要稍微重组代码,以便所有等待和循环都发生在协程中,否则您的程序将阻塞。
if (NoOfEnemies == 0){
waveNumber++;
StartingAmount = Mathf.RoundToInt(waveNumber + (Mathf.Pow(1.2f, waveNumber)));
StartCoroutine(GradualSpawn(StartingAmount));
}
然后在你的协程中
IEnumerator GradualSpawn(int StartingAmount)
{
for (int i = 0; i < StartingAmount; i++){
SpawnEnemy();
yield return new WaitForSeconds(0.5f);
}
}
这应该每 0.5 秒产生一个敌人。
希望这有帮助