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

如何为Unity敌人生成器设置生成数量上限?

敌人生成器超上限问题修复方案

问题根源

你的代码存在两个核心问题:

  • 仅在Start()方法中检查一次敌人数量,之后启动的协程会无限制递归调用自己,完全不考虑当前存活敌人是否已经达到上限。
  • StopCoroutine()的调用时机无效,既没有在协程运行中动态判断停止,也无法阻止已经启动的递归协程。

修复后的代码

public class EnemySpawner : MonoBehaviour
{
    [SerializeField] GameObject enemyPrefab;
    [SerializeField] private float spawnRate = 4f;
    private int spawnsLimit = 4;

    private int xPos;
    private int zPos;

    private void Start()
    {
        StartCoroutine(EnemySpawnLoop());
    }

    IEnumerator EnemySpawnLoop()
    {
        while (true)
        {
            // 获取当前存活的敌人数量
            int currentEnemyCount = GameObject.FindGameObjectsWithTag("Enemy").Length;
            
            // 只有当数量未达上限时才生成敌人
            if (currentEnemyCount < spawnsLimit)
            {
                xPos = Random.Range(-20, 20);
                zPos = Random.Range(-20, 20);
                Instantiate(enemyPrefab, new Vector3(xPos, 1, zPos), Quaternion.identity);
            }
            
            // 等待指定间隔后再检查
            yield return new WaitForSeconds(spawnRate);
        }
    }
}

关键改进点

  • 用while(true)循环替代递归调用协程,每次循环都会重新检查当前敌人数量,确保只有在数量不足时才生成。
  • 移除了无效的StopCoroutine()调用,改为动态判断生成条件,逻辑更简洁可靠。
  • 每次循环都重新获取当前敌人数量,保证敌人被销毁后能及时触发新的生成。

额外优化建议

如果场景中敌人数量较多,GameObject.FindGameObjectsWithTag()会有一定性能开销。可以改为维护一个敌人列表:

  1. 在敌人的脚本中添加销毁时的回调,通知生成器从列表中移除自己。
  2. 生成器每次生成敌人时将其加入列表,通过列表长度判断当前存活数量,避免频繁查找。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:50:31