using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonoPool<T> where T : MonoBehaviour
{
private bool m_isAutoActive = false; // 自动Active, 获取true,释放false
// 注: 大量SetParent会导致性能降低
private Transform m_transNewParent = null; // 创建的时候 挂载到目标节点下作为子节点
private Transform m_transFreeParent = null; // 回收的时候 挂载到目标节点下作为子节点
/// <summary>
/// 构造初始化
/// </summary>
/// <param name="preObj">实例化对象Prefab</param>
/// <param name="transNewParent">创建父节点</param>
/// <param name="transFreeParent">销毁父节点</param>
/// <param name="isAutoActive">自动Active</param>
public MonoPool(T preObj,
Transform transNewParent = null,
Transform transFreeParent = null,
bool isAutoActive = false)
{
m_preObj = preObj;
m_transNewParent = transNewParent;
m_transFreeParent = transFreeParent;
m_isAutoActive = isAutoActive;
}
private T m_preObj = null;
private Queue<T> m_queueObjs = new Queue<T>(); // 池 被回收
private List<T> m_listUsing = new List<T>(); // 池 使用中
public List<T> ListData
{
get
{
return m_listUsing;
}
}
public T GetOne()
{
return GetOne(null);
}
public T GetOne(Transform parent)
{
Transform transParent = parent;
if (transParent == null)
{
transParent = m_transNewParent;
}
T result;
if (m_queueObjs.Count > 0)
{
result = m_queueObjs.Dequeue();
if (transParent != null && m_transFreeParent != null)
{
Transform trans = result.transform;
trans.SetParent(transParent);
trans.localPosition = Vector3.zero;
}
}
else
{
if (transParent == null)
{
result = UnityEngine.GameObject.Instantiate(m_preObj) as T;
}
else
{
result = UnityEngine.GameObject.Instantiate(m_preObj, transParent, false) as T;
}
}
if (m_isAutoActive)
{
result.gameObject.SetActive(true);
}
m_listUsing.Add(result);
return result;
}
public void FreeOne(T obj)
{
if (m_listUsing.Contains(obj))
{
FreeLogicStep(obj);
m_listUsing.Remove(obj);
}
}
/// <summary>
/// 回收所有
/// </summary>
/// <param name="isDestory">true=删除所有对象, false=只回收,不删除</param>
public void FreeAll(bool isDestory = false)
{
if (isDestory)
{
for (int i = 0; i < m_listUsing.Count; i++)
{
GameObject.Destroy(m_listUsing[i].gameObject);
}
foreach (var item in m_queueObjs)
{
GameObject.Destroy(item.gameObject);
}
m_queueObjs.Clear();
}
else
{
for (int i = 0; i < m_listUsing.Count; i++)
{
FreeLogicStep(m_listUsing[i]);
}
}
m_listUsing.Clear();
}
private void FreeLogicStep(T obj)
{
if (m_isAutoActive)
{
obj.gameObject.SetActive(false);
}
if (m_transFreeParent != null)
{
obj.transform.SetParent(m_transFreeParent);
}
m_queueObjs.Enqueue(obj);
}
}
程序学无止尽。
欢迎大家沟通,有啥不明确的,或者不对的,也可以和我私聊
我的QQ 334524067 神一般的狄狄