Unity 对象池

本文介绍了一个Unity框架中的对象池实现方式,包括对象的创建、获取、回收等操作,并提供了构造、销毁及状态变更的回调功能。
using System;
using System.Collections.Generic;
using UnityEngine;

namespace Framework {
	/// <summary>
	/// 对象池
	/// </summary>
	public sealed class ObjectPool {

		private const string LOG_NULL = "Construct callback is null ";

		/// <summary>
		/// 构造步长
		/// </summary>
		public ushort constructStep = 1;

		/// <summary>
		/// 对象构造回调
		/// </summary>
		private Func<object> m_OnConstruct;

		/// <summary>
		/// 销毁回调
		/// </summary>
		private Action<object> m_OnDestroy;

		/// <summary>
		/// 启用回调
		/// </summary>
		private Action<object> m_OnEnabled;

		/// <summary>
		/// 关闭回调
		/// </summary>
		private Action<object> m_OnDisabled;

		/// <summary>
		/// 启用链表
		/// </summary>
		private List<object> m_EnabledList = new List<object> ();

		/// <summary>
		/// 关闭池
		/// </summary>
		private Queue<object> m_DisabledPool = new Queue<object> ();

		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="onContruct">对象构造回调</param>
		/// <param name="onDestroy">对象销毁回调</param>
		/// <param name="onEnabled"></param>
		/// <param name="onDisabled"></param>
		public ObjectPool (Func<object> onContruct, Action<object> onDestroy = null, Action<object> onEnabled = null, Action<object> onDisabled = null) {
			if (onContruct == null) {
				Debug.LogError (LOG_NULL);
			}
		}

		/// <summary>
		/// 添加对象
		/// </summary>
		/// <returns></returns>
		private object Add () {
			for (int i = 0; i < constructStep - 1; ++i) {
				object obj = m_OnConstruct.Invoke ();
				m_DisabledPool.Enqueue (obj);
			}

			return m_OnConstruct.Invoke ();
		}

		/// <summary>
		/// 获取对象
		/// </summary>
		/// <returns>返回对象</returns>
		public object Get () {
			object obj = m_DisabledPool.Count > 0 ? m_DisabledPool.Dequeue () : Add ();
			m_EnabledList.Add (obj);

			if (m_OnEnabled != null) {
				m_OnEnabled.Invoke (obj);
			}

			return obj;
		}

		/// <summary>
		/// 获取所有对象
		/// </summary>
		/// <returns></returns>
		public object[] GetAll () {
			return m_EnabledList.ToArray ();
		}

		/// <summary>
		/// 回收对象
		/// </summary>
		/// <param name="obj"></param>
		public void Remove (object obj) {
			if (!m_EnabledList.Contains (obj)) {
				return;
			}

			m_EnabledList.Remove (obj);
			m_DisabledPool.Enqueue (obj);

			if (m_OnDisabled != null) {
				m_OnDisabled.Invoke (obj);
			}
		}

		/// <summary>
		/// 清理对象
		/// </summary>
		/// <param name="destroy">是否销毁</param>
		public void Clear (bool destroy = true) {
			if (destroy) {
				if (m_OnDestroy != null) {
					foreach (var obj in m_EnabledList) {
						m_OnDestroy.Invoke (obj);
					}

					while (m_DisabledPool.Count > 0) {
						m_OnDestroy.Invoke (m_DisabledPool.Dequeue ());
					}
				}

				m_EnabledList.Clear ();
				m_DisabledPool.Clear ();
			} else {
				foreach (var obj in m_EnabledList) {
					m_DisabledPool.Enqueue (obj);

					if (m_OnDisabled != null) {
						m_OnDisabled.Invoke (obj);
					}
				}
				m_EnabledList.Clear ();
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值