如何为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()会有一定性能开销。可以改为维护一个敌人列表:
- 在敌人的脚本中添加销毁时的回调,通知生成器从列表中移除自己。
- 生成器每次生成敌人时将其加入列表,通过列表长度判断当前存活数量,避免频繁查找。
内容的提问来源于stack exchange,提问作者Raf Kam
相关产品推荐
相关产品推荐

