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
相关产品推荐
相关产品推荐

