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

塔防游戏中同一波生成多种敌人的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:31:23