You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何让coroutine挂起直到条件成立后再生成下一波敌人

实现波次等待敌人全灭的代码修改方案

原有代码的问题是SpawnAllEnemiesInWave协程仅在完成所有敌人生成后就直接结束,因此会立刻触发下一波初始化,新增全灭检测逻辑后的完整代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemySpawner : MonoBehaviour
{
    [SerializeField] List<WaveConfig> waveConfigs; // 存储多波敌人的配置,例:3波敌人每波5个单位
    [SerializeField] int startingWave = 0;
    [SerializeField] bool looping = false;

    IEnumerator Start()
    {
        do
        {
            yield return StartCoroutine(SpawnAllWaves());
        }
        while (looping);
    }

    private IEnumerator SpawnAllWaves()
    {
        for (int waveIndex = startingWave; waveIndex < waveConfigs.Count; waveIndex++)
        {
            var currentWave = waveConfigs[waveIndex];
            // 只有当前波协程完全结束(敌人全灭)才会进入下一波
            yield return StartCoroutine(SpawnAllEnemiesInWave(currentWave));
        }
    }

    private IEnumerator SpawnAllEnemiesInWave(WaveConfig waveConfig)
    {
        // 存储当前波生成的所有敌人实例
        List<GameObject> currentWaveEnemies = new List<GameObject>();
        
        for (int enemyCount = 0; enemyCount < waveConfig.GetNumberOfEnemies(); enemyCount++)
        {
            var newEnemy = Instantiate(
                waveConfig.GetEnemyPrefab(),
                waveConfig.GetWaypoints()[0].transform.position,
                Quaternion.identity);
            newEnemy.GetComponent<EnemyPathing>().SetWaveConfig(waveConfig);
            // 将生成的敌人加入当前波的实例列表
            currentWaveEnemies.Add(newEnemy);
            yield return new WaitForSeconds(waveConfig.GetTimeBetweenSpawns());
        }

        // 新增:等待当前波所有敌人从场景中消失
        while (currentWaveEnemies.Count > 0)
        {
            // 移除已经被销毁的敌人实例
            currentWaveEnemies.RemoveAll(enemy => enemy == null);
            // 每0.2秒检测一次,避免每帧检测浪费性能,可根据需求调整间隔
            yield return new WaitForSeconds(0.2f);
        }
    }
}

关键改动说明

  • 新增了当前波敌人实例的存储列表,每生成一个敌人就加入列表统一管理
  • 单波所有敌人生成完成后,增加循环检测逻辑,只有列表内所有敌人实例都被销毁(判定为null)后,才会结束当前协程,触发下一波的初始化
  • 检测间隔设置为0.2秒,平衡响应速度和性能消耗,可根据实际需求调整数值

内容的提问来源于stack exchange,提问作者Roman_Shon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 23:09:03