Cute_demon_attacks/meng_yao/Assets/script/A_Fight/SpawnPool.cs
2024-12-09 23:24:46 +08:00

166 lines
4.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObJPool<T>
{
public List<T> SurvivalPool = new List<T>();
public List<T> DeathPool = new List<T>();
// 获取一个对象
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<GameObject> EnemyPool = new ObJPool<GameObject>();
[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<gameGlobal>().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<gameGlobal>().OnGamePlay -= this.StartSpawning;
}
}