using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObJPool { public List SurvivalPool = new List(); public List DeathPool = new List(); // 获取一个对象 public T Get() { if (DeathPool.Count > 0) { // 如果死亡池中有对象,则从死亡池中取出并转移到生存池 T obj = DeathPool[0]; DeathPool.RemoveAt(0); SurvivalPool.Add(obj); return obj; } return default(T); // 如果没有可用对象,则返回默认值 } // 回收一个对象 public void Return(T obj) { if (SurvivalPool.Contains(obj)) { SurvivalPool.Remove(obj); DeathPool.Add(obj); } } } public class SpawnPool : Base { public ObJPool EnemyPool = new ObJPool(); [Header("生成预制体")] public GameObject Prefab; [Header("生成位置")] public Transform SpawnLocation; [Header("生成父节点")] public Transform GenerateParentNode; [Header("一波生成间隔")] public float GenerationInterval; [Header("一次生成间隔")] public float GenerationIntervalOfOne; [Header("生成总数量")] public float GenerateQuantityMax; [Header("每一波生成数量")] public float GenerateQuantity; private float lastGenerationTime = 0f; // 记录上一波生成的时间 private float lastSingleGenerationTime = 0f; // 记录生成单个敌人之间的时间 private int generatedCount = 0; // 记录已生成敌人的数量 private int currentWave = 0; // 当前波数 private bool isGenerating = false; // 标记是否在生成敌人 private bool isWaveComplete = false; // 标记当前波是否完成 // Start is called before the first frame update void Start() { Base.GlobalObj.GetComponent().OnGamePlay += this.StartSpawning; } void Update() { if (isGenerating) { if (isWaveComplete) { // 如果当前波已完成,等待下一波 if (Time.time - lastGenerationTime >= GenerationInterval) { StartNextWave(); // 启动下一波生成 } } else { // 判断是否到了生成一波敌人的时间 if (Time.time - lastSingleGenerationTime >= GenerationIntervalOfOne && generatedCount < GenerateQuantity) { GenerateEnemy(); // 生成单个敌人 lastSingleGenerationTime = Time.time; // 更新生成单个敌人的时间 } } } } void StartSpawning() { // 重置生成计数,开始生成敌人 generatedCount = 0; currentWave = 0; lastGenerationTime = Time.time; // 记录开始生成的时间 isGenerating = true; // 启动生成敌人 isWaveComplete = false; // 当前波尚未完成 } void StartNextWave() { currentWave++; // 增加波数 if (generatedCount < GenerateQuantityMax) // 如果生成的敌人数量未达到最大值 { generatedCount = 0; // 重置每波生成数量 lastGenerationTime = Time.time; // 记录下一波开始的时间 isWaveComplete = false; // 当前波未完成 } else { isGenerating = false; // 如果已经生成完所有敌人,则停止生成 } } void GenerateEnemy() { if (generatedCount < GenerateQuantity && generatedCount < GenerateQuantityMax) { GameObject enemy = EnemyPool.Get(); // 获取一个敌人对象 // 如果池子中没有可用的对象,创建新的敌人 if (enemy == null) { if (Prefab == null) { Debug.LogError("Prefab is not assigned."); return; } enemy = Instantiate(Prefab, SpawnLocation.position, Quaternion.identity, GenerateParentNode); } // 设置敌人的位置和其他属性 enemy.SetActive(true); // 激活敌人对象 enemy.transform.position = SpawnLocation.position; generatedCount++; // 更新生成计数 // 每波生成数量达到上限时,标记当前波已完成 if (generatedCount >= GenerateQuantity) { isWaveComplete = true; // 当前波生成完毕 } } } // 当池子中敌人死亡或者被回收时,将其回收到池中 public void ReturnEnemyToPool(GameObject enemy) { enemy.SetActive(false); // 禁用敌人对象 EnemyPool.Return(enemy); // 将敌人回收到池中 } private void OnDisable() { Base.GlobalObj.GetComponent().OnGamePlay -= this.StartSpawning; } }