166 lines
4.6 KiB
C#
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;
|
|
}
|
|
}
|