塔防游戏中同一波生成多种敌人的C#代码实现求助
实现同一波生成多种敌人的修改方案
1. 定义单种敌人的生成配置
先创建一个可序列化的类,用来独立存储每种敌人的生成参数:
[System.Serializable] public class EnemySpawnEntry { public GameObject enemyPrefab; // 敌人预制体 public int spawnCount; // 该类型敌人的生成数量 public float spawnRate; // 该类型敌人的生成速率(每秒生成数量) }
2. 修改Wave2类,支持多敌人类型
将原Wave2类中单一的敌人字段替换为EnemySpawnEntry数组,这样每一波就能配置多种敌人:
[System.Serializable] public class Wave2 { public EnemySpawnEntry[] enemySpawnEntries; // 该波包含的所有敌人类型配置 }
3. 更新WaveSpawner_2的生成逻辑
调整生成协程和相关逻辑,适配多敌人类型的生成需求:
public class WaveSpawner_2 : MonoBehaviour { public static int EnemiesAlive = 0; public Wave2[] waves; public Transform spawnPoint; public float timeBetweenWaves = 5f; [SerializeField] TextMeshProUGUI waveCountDownText; public GameManager gameManager; float countDown = 2f; int waveIndex = 0; void Start() { EnemiesAlive = 0; } private void Update() { if (EnemiesAlive > 0) { return; } if (waveIndex == waves.Length) { gameManager.WinLevel(); this.enabled = false; return; } if (countDown <= 0f) { StartCoroutine(SpawnWave()); countDown = timeBetweenWaves; return; } countDown -= Time.deltaTime; countDown = Mathf.Clamp(countDown, 0f, Mathf.Infinity); waveCountDownText.text = string.Format("{0:00.00}", countDown); } IEnumerator SpawnWave() { PlayerStats.Rounds++; Wave2 wave = waves[waveIndex]; // 计算本波总敌人数量 int totalEnemies = 0; foreach (var entry in wave.enemySpawnEntries) { totalEnemies += entry.spawnCount; } EnemiesAlive = totalEnemies; // 遍历每种敌人类型,按配置生成对应数量的敌人 foreach (var entry in wave.enemySpawnEntries) { for (int i = 0; i < entry.spawnCount; i++) { SpawnEnemy(entry.enemyPrefab); yield return new WaitForSeconds(1f / entry.spawnRate); } } waveIndex++; } void SpawnEnemy(GameObject enemy) { Instantiate(enemy, spawnPoint.position, spawnPoint.rotation); // 注意:需在敌人的死亡脚本中调用 WaveSpawner_2.EnemiesAlive--; 否则EnemiesAlive不会正确减少 } }
关键改动说明
- 新增
EnemySpawnEntry类,让每种敌人的生成参数独立,可在Unity Inspector中直观编辑 - Wave2类改为存储多组敌人配置,支持同一波添加任意多种敌人
- 调整
SpawnWave协程逻辑,先计算本波总敌人数量,再按配置逐个生成每种敌人 - 必须在敌人死亡逻辑中减少
EnemiesAlive数值,否则下一波生成逻辑会被阻塞
额外优化:实现敌人穿插生成
如果需要同一波内多种敌人交替生成(而非先生成完一种再生成另一种),可以用队列打乱生成顺序:
IEnumerator SpawnWave() { PlayerStats.Rounds++; Wave2 wave = waves[waveIndex]; Queue<GameObject> spawnQueue = new Queue<GameObject>(); int totalEnemies = 0; // 将所有敌人加入队列 foreach (var entry in wave.enemySpawnEntries) { for (int i = 0; i < entry.spawnCount; i++) { spawnQueue.Enqueue(entry.enemyPrefab); totalEnemies++; } } // 打乱队列实现随机穿插(可选) var spawnList = spawnQueue.ToList(); spawnList.Shuffle(); spawnQueue = new Queue<GameObject>(spawnList); EnemiesAlive = totalEnemies; // 按统一间隔生成队列中的敌人 float spawnInterval = 0.5f; while (spawnQueue.Count > 0) { SpawnEnemy(spawnQueue.Dequeue()); yield return new WaitForSeconds(spawnInterval); } waveIndex++; }
内容的提问来源于stack exchange,提问作者Nak8dBear
相关产品推荐
相关产品推荐

