留个档,MonoBehaviour对象池

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 神一般的狄狄

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值