using System; using System.Collections.Generic; using AlicizaX; using UnityEngine; namespace AlicizaX.ObjectPool { /// /// 对象池管理器。 /// [UnityEngine.Scripting.Preserve] internal sealed partial class ObjectPoolService : ServiceBase, IObjectPoolService, IServiceTickable { private const int DefaultCapacity = int.MaxValue; private const float DefaultExpireTime = float.MaxValue; private const int DefaultPriority = 0; private readonly Dictionary m_ObjectPools; private readonly List m_ObjectPoolList; private readonly List m_CachedAllObjectPools; private readonly Comparison m_ObjectPoolComparer; /// /// 初始化对象池管理器的新实例。 /// public ObjectPoolService() { m_ObjectPools = new Dictionary(); m_ObjectPoolList = new List(); m_CachedAllObjectPools = new List(); m_ObjectPoolComparer = ObjectPoolComparer; } /// /// 获取游戏框架模块优先级。 /// /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 public int Priority => 1; /// /// 获取对象池数量。 /// public int Count { get { return m_ObjectPools.Count; } } /// /// 对象池管理器轮询。 /// /// 逻辑流逝时间,以秒为单位。 /// 真实流逝时间,以秒为单位。 void IServiceTickable.Tick(float deltaTime) { for (int i = 0; i < m_ObjectPoolList.Count; i++) { m_ObjectPoolList[i].Update(deltaTime, Time.unscaledDeltaTime); } } /// /// 关闭并清理对象池管理器。 /// protected override void OnInitialize() { } protected override void OnDestroyService() { for (int i = 0; i < m_ObjectPoolList.Count; i++) { m_ObjectPoolList[i].Shutdown(); } m_ObjectPools.Clear(); m_ObjectPoolList.Clear(); m_CachedAllObjectPools.Clear(); } /// /// 检查是否存在对象池。 /// /// 对象类型。 /// 是否存在对象池。 public bool HasObjectPool() where T : ObjectBase { return InternalHasObjectPool(new TypeNamePair(typeof(T))); } /// /// 检查是否存在对象池。 /// /// 对象类型。 /// 是否存在对象池。 public bool HasObjectPool(Type objectType) { if (objectType == null) { throw new GameFrameworkException("Object type is invalid."); } if (!typeof(ObjectBase).IsAssignableFrom(objectType)) { throw new GameFrameworkException(Utility.Text.Format("Object type '{0}' is invalid.", objectType.FullName)); } return InternalHasObjectPool(new TypeNamePair(objectType)); } /// /// 检查是否存在对象池。 /// /// 对象类型。 /// 对象池名称。 /// 是否存在对象池。 public bool HasObjectPool(string name) where T : ObjectBase { return InternalHasObjectPool(new TypeNamePair(typeof(T), name)); } /// /// 检查是否存在对象池。 /// /// 对象类型。 /// 对象池名称。 /// 是否存在对象池。 public bool HasObjectPool(Type objectType, string name) { if (objectType == null) { throw new GameFrameworkException("Object type is invalid."); } if (!typeof(ObjectBase).IsAssignableFrom(objectType)) { throw new GameFrameworkException(Utility.Text.Format("Object type '{0}' is invalid.", objectType.FullName)); } return InternalHasObjectPool(new TypeNamePair(objectType, name)); } /// /// 检查是否存在对象池。 /// /// 要检查的条件。 /// 是否存在对象池。 public bool HasObjectPool(Predicate condition) { if (condition == null) { throw new GameFrameworkException("Condition is invalid."); } for (int i = 0; i < m_ObjectPoolList.Count; i++) { if (condition(m_ObjectPoolList[i])) { return true; } } return false; } /// /// 获取对象池。 /// /// 对象类型。 /// 要获取的对象池。 public IObjectPool GetObjectPool() where T : ObjectBase { return (IObjectPool)InternalGetObjectPool(new TypeNamePair(typeof(T))); } /// /// 获取对象池。 /// /// 对象类型。 /// 要获取的对象池。 public ObjectPoolBase GetObjectPool(Type objectType) { if (objectType == null) { throw new GameFrameworkException("Object type is invalid."); } if (!typeof(ObjectBase).IsAssignableFrom(objectType)) { throw new GameFrameworkException(Utility.Text.Format("Object type '{0}' is invalid.", objectType.FullName)); } return InternalGetObjectPool(new TypeNamePair(objectType)); } /// /// 获取对象池。 /// /// 对象类型。 /// 对象池名称。 /// 要获取的对象池。 public IObjectPool GetObjectPool(string name) where T : ObjectBase { return (IObjectPool)InternalGetObjectPool(new TypeNamePair(typeof(T), name)); } /// /// 获取对象池。 /// /// 对象类型。 /// 对象池名称。 /// 要获取的对象池。 public ObjectPoolBase GetObjectPool(Type objectType, string name) { if (objectType == null) { throw new GameFrameworkException("Object type is invalid."); } if (!typeof(ObjectBase).IsAssignableFrom(objectType)) { throw new GameFrameworkException(Utility.Text.Format("Object type '{0}' is invalid.", objectType.FullName)); } return InternalGetObjectPool(new TypeNamePair(objectType, name)); } /// /// 获取对象池。 /// /// 要检查的条件。 /// 要获取的对象池。 public ObjectPoolBase GetObjectPool(Predicate condition) { if (condition == null) { throw new GameFrameworkException("Condition is invalid."); } for (int i = 0; i < m_ObjectPoolList.Count; i++) { if (condition(m_ObjectPoolList[i])) { return m_ObjectPoolList[i]; } } return null; } /// /// 获取对象池。 /// /// 要检查的条件。 /// 要获取的对象池。 public ObjectPoolBase[] GetObjectPools(Predicate condition) { if (condition == null) { throw new GameFrameworkException("Condition is invalid."); } List results = new List(); for (int i = 0; i < m_ObjectPoolList.Count; i++) { if (condition(m_ObjectPoolList[i])) { results.Add(m_ObjectPoolList[i]); } } return results.ToArray(); } /// /// 获取对象池。 /// /// 要检查的条件。 /// 要获取的对象池。 public void GetObjectPools(Predicate condition, List results) { if (condition == null) { throw new GameFrameworkException("Condition is invalid."); } if (results == null) { throw new GameFrameworkException("Results is invalid."); } results.Clear(); for (int i = 0; i < m_ObjectPoolList.Count; i++) { if (condition(m_ObjectPoolList[i])) { results.Add(m_ObjectPoolList[i]); } } } /// /// 获取所有对象池。 /// /// 所有对象池。 public ObjectPoolBase[] GetAllObjectPools() { return GetAllObjectPools(false); } /// /// 获取所有对象池。 /// /// 所有对象池。 public void GetAllObjectPools(List results) { GetAllObjectPools(false, results); } /// /// 获取所有对象池。 /// /// 是否根据对象池的优先级排序。 /// 所有对象池。 public ObjectPoolBase[] GetAllObjectPools(bool sort) { if (sort) { List results = new List(m_ObjectPoolList); results.Sort(m_ObjectPoolComparer); return results.ToArray(); } else { return m_ObjectPoolList.ToArray(); } } /// /// 获取所有对象池。 /// /// 是否根据对象池的优先级排序。 /// 所有对象池。 public void GetAllObjectPools(bool sort, List results) { if (results == null) { throw new GameFrameworkException("Results is invalid."); } results.Clear(); results.AddRange(m_ObjectPoolList); if (sort) { results.Sort(m_ObjectPoolComparer); } } public IObjectPool CreatePool(ObjectPoolCreateOptions options = default) where T : ObjectBase { return InternalCreateObjectPool( options.Name, options.AllowMultiSpawn, NormalizeAutoReleaseInterval(options.AutoReleaseInterval), NormalizeCapacity(options.Capacity), NormalizeExpireTime(options.ExpireTime), options.Priority); } public ObjectPoolBase CreatePool(Type objectType, ObjectPoolCreateOptions options = default) { return InternalCreateObjectPool( objectType, options.Name, options.AllowMultiSpawn, NormalizeAutoReleaseInterval(options.AutoReleaseInterval), NormalizeCapacity(options.Capacity), NormalizeExpireTime(options.ExpireTime), options.Priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool() where T : ObjectBase { return InternalCreateObjectPool(string.Empty, false, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType) { return InternalCreateObjectPool(objectType, string.Empty, false, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(string name) where T : ObjectBase { return InternalCreateObjectPool(name, false, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, string name) { return InternalCreateObjectPool(objectType, name, false, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(int capacity) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, false, DefaultExpireTime, capacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, int capacity) { return InternalCreateObjectPool(objectType, string.Empty, false, DefaultExpireTime, capacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池对象过期秒数。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(float expireTime) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, false, expireTime, DefaultCapacity, expireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池对象过期秒数。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, float expireTime) { return InternalCreateObjectPool(objectType, string.Empty, false, expireTime, DefaultCapacity, expireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(string name, int capacity) where T : ObjectBase { return InternalCreateObjectPool(name, false, DefaultExpireTime, capacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, string name, int capacity) { return InternalCreateObjectPool(objectType, name, false, DefaultExpireTime, capacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池对象过期秒数。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(string name, float expireTime) where T : ObjectBase { return InternalCreateObjectPool(name, false, expireTime, DefaultCapacity, expireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池对象过期秒数。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, string name, float expireTime) { return InternalCreateObjectPool(objectType, name, false, expireTime, DefaultCapacity, expireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(int capacity, float expireTime) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, false, expireTime, capacity, expireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, int capacity, float expireTime) { return InternalCreateObjectPool(objectType, string.Empty, false, expireTime, capacity, expireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(int capacity, int priority) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, false, DefaultExpireTime, capacity, DefaultExpireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, int capacity, int priority) { return InternalCreateObjectPool(objectType, string.Empty, false, DefaultExpireTime, capacity, DefaultExpireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, false, expireTime, DefaultCapacity, expireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, float expireTime, int priority) { return InternalCreateObjectPool(objectType, string.Empty, false, expireTime, DefaultCapacity, expireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(string name, int capacity, float expireTime) where T : ObjectBase { return InternalCreateObjectPool(name, false, expireTime, capacity, expireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, string name, int capacity, float expireTime) { return InternalCreateObjectPool(objectType, name, false, expireTime, capacity, expireTime, DefaultPriority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(string name, int capacity, int priority) where T : ObjectBase { return InternalCreateObjectPool(name, false, DefaultExpireTime, capacity, DefaultExpireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, string name, int capacity, int priority) { return InternalCreateObjectPool(objectType, name, false, DefaultExpireTime, capacity, DefaultExpireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(string name, float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(name, false, expireTime, DefaultCapacity, expireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, string name, float expireTime, int priority) { return InternalCreateObjectPool(objectType, name, false, expireTime, DefaultCapacity, expireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(int capacity, float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, false, expireTime, capacity, expireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, int capacity, float expireTime, int priority) { return InternalCreateObjectPool(objectType, string.Empty, false, expireTime, capacity, expireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(string name, int capacity, float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(name, false, expireTime, capacity, expireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, string name, int capacity, float expireTime, int priority) { return InternalCreateObjectPool(objectType, name, false, expireTime, capacity, expireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池自动释放可释放对象的间隔秒数。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public IObjectPool CreateSingleSpawnObjectPool(string name, float autoReleaseInterval, int capacity, float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(name, false, autoReleaseInterval, capacity, expireTime, priority); } /// /// 创建允许单次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池自动释放可释放对象的间隔秒数。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许单次获取的对象池。 public ObjectPoolBase CreateSingleSpawnObjectPool(Type objectType, string name, float autoReleaseInterval, int capacity, float expireTime, int priority) { return InternalCreateObjectPool(objectType, name, false, autoReleaseInterval, capacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool() where T : ObjectBase { return InternalCreateObjectPool(string.Empty, true, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType) { return InternalCreateObjectPool(objectType, string.Empty, true, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(string name) where T : ObjectBase { return InternalCreateObjectPool(name, true, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, string name) { return InternalCreateObjectPool(objectType, name, true, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(int capacity) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, true, DefaultExpireTime, capacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, int capacity) { return InternalCreateObjectPool(objectType, string.Empty, true, DefaultExpireTime, capacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池对象过期秒数。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(float expireTime) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, true, expireTime, DefaultCapacity, expireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池对象过期秒数。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, float expireTime) { return InternalCreateObjectPool(objectType, string.Empty, true, expireTime, DefaultCapacity, expireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(string name, int capacity) where T : ObjectBase { return InternalCreateObjectPool(name, true, DefaultExpireTime, capacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, string name, int capacity) { return InternalCreateObjectPool(objectType, name, true, DefaultExpireTime, capacity, DefaultExpireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池对象过期秒数。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(string name, float expireTime) where T : ObjectBase { return InternalCreateObjectPool(name, true, expireTime, DefaultCapacity, expireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池对象过期秒数。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, string name, float expireTime) { return InternalCreateObjectPool(objectType, name, true, expireTime, DefaultCapacity, expireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(int capacity, float expireTime) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, true, expireTime, capacity, expireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, int capacity, float expireTime) { return InternalCreateObjectPool(objectType, string.Empty, true, expireTime, capacity, expireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(int capacity, int priority) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, true, DefaultExpireTime, capacity, DefaultExpireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, int capacity, int priority) { return InternalCreateObjectPool(objectType, string.Empty, true, DefaultExpireTime, capacity, DefaultExpireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, true, expireTime, DefaultCapacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, float expireTime, int priority) { return InternalCreateObjectPool(objectType, string.Empty, true, expireTime, DefaultCapacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(string name, int capacity, float expireTime) where T : ObjectBase { return InternalCreateObjectPool(name, true, expireTime, capacity, expireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, string name, int capacity, float expireTime) { return InternalCreateObjectPool(objectType, name, true, expireTime, capacity, expireTime, DefaultPriority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(string name, int capacity, int priority) where T : ObjectBase { return InternalCreateObjectPool(name, true, DefaultExpireTime, capacity, DefaultExpireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, string name, int capacity, int priority) { return InternalCreateObjectPool(objectType, name, true, DefaultExpireTime, capacity, DefaultExpireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(string name, float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(name, true, expireTime, DefaultCapacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, string name, float expireTime, int priority) { return InternalCreateObjectPool(objectType, name, true, expireTime, DefaultCapacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(int capacity, float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(string.Empty, true, expireTime, capacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, int capacity, float expireTime, int priority) { return InternalCreateObjectPool(objectType, string.Empty, true, expireTime, capacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(string name, int capacity, float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(name, true, expireTime, capacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, string name, int capacity, float expireTime, int priority) { return InternalCreateObjectPool(objectType, name, true, expireTime, capacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池自动释放可释放对象的间隔秒数。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public IObjectPool CreateMultiSpawnObjectPool(string name, float autoReleaseInterval, int capacity, float expireTime, int priority) where T : ObjectBase { return InternalCreateObjectPool(name, true, autoReleaseInterval, capacity, expireTime, priority); } /// /// 创建允许多次获取的对象池。 /// /// 对象类型。 /// 对象池名称。 /// 对象池自动释放可释放对象的间隔秒数。 /// 对象池的容量。 /// 对象池对象过期秒数。 /// 对象池的优先级。 /// 要创建的允许多次获取的对象池。 public ObjectPoolBase CreateMultiSpawnObjectPool(Type objectType, string name, float autoReleaseInterval, int capacity, float expireTime, int priority) { return InternalCreateObjectPool(objectType, name, true, autoReleaseInterval, capacity, expireTime, priority); } /// /// 销毁对象池。 /// /// 对象类型。 /// 是否销毁对象池成功。 public bool DestroyObjectPool() where T : ObjectBase { return InternalDestroyObjectPool(new TypeNamePair(typeof(T))); } /// /// 销毁对象池。 /// /// 对象类型。 /// 是否销毁对象池成功。 public bool DestroyObjectPool(Type objectType) { if (objectType == null) { throw new GameFrameworkException("Object type is invalid."); } if (!typeof(ObjectBase).IsAssignableFrom(objectType)) { throw new GameFrameworkException(Utility.Text.Format("Object type '{0}' is invalid.", objectType.FullName)); } return InternalDestroyObjectPool(new TypeNamePair(objectType)); } /// /// 销毁对象池。 /// /// 对象类型。 /// 要销毁的对象池名称。 /// 是否销毁对象池成功。 public bool DestroyObjectPool(string name) where T : ObjectBase { return InternalDestroyObjectPool(new TypeNamePair(typeof(T), name)); } /// /// 销毁对象池。 /// /// 对象类型。 /// 要销毁的对象池名称。 /// 是否销毁对象池成功。 public bool DestroyObjectPool(Type objectType, string name) { if (objectType == null) { throw new GameFrameworkException("Object type is invalid."); } if (!typeof(ObjectBase).IsAssignableFrom(objectType)) { throw new GameFrameworkException(Utility.Text.Format("Object type '{0}' is invalid.", objectType.FullName)); } return InternalDestroyObjectPool(new TypeNamePair(objectType, name)); } /// /// 销毁对象池。 /// /// 对象类型。 /// 要销毁的对象池。 /// 是否销毁对象池成功。 public bool DestroyObjectPool(IObjectPool objectPool) where T : ObjectBase { if (objectPool == null) { throw new GameFrameworkException("Object pool is invalid."); } return InternalDestroyObjectPool(new TypeNamePair(typeof(T), objectPool.Name)); } /// /// 销毁对象池。 /// /// 要销毁的对象池。 /// 是否销毁对象池成功。 public bool DestroyObjectPool(ObjectPoolBase objectPool) { if (objectPool == null) { throw new GameFrameworkException("Object pool is invalid."); } return InternalDestroyObjectPool(new TypeNamePair(objectPool.ObjectType, objectPool.Name)); } /// /// 释放对象池中的可释放对象。 /// public void Release() { GetAllObjectPools(true, m_CachedAllObjectPools); foreach (ObjectPoolBase objectPool in m_CachedAllObjectPools) { objectPool.Release(); } } /// /// 释放对象池中的所有未使用对象。 /// public void ReleaseAllUnused() { GetAllObjectPools(true, m_CachedAllObjectPools); foreach (ObjectPoolBase objectPool in m_CachedAllObjectPools) { objectPool.ReleaseAllUnused(); } } private bool InternalHasObjectPool(TypeNamePair typeNamePair) { return m_ObjectPools.ContainsKey(typeNamePair); } private static float NormalizeAutoReleaseInterval(float autoReleaseInterval) { return autoReleaseInterval == default ? DefaultExpireTime : autoReleaseInterval; } private static int NormalizeCapacity(int capacity) { return capacity == default ? DefaultCapacity : capacity; } private static float NormalizeExpireTime(float expireTime) { return expireTime == default ? DefaultExpireTime : expireTime; } private ObjectPoolBase InternalGetObjectPool(TypeNamePair typeNamePair) { ObjectPoolBase objectPool = null; if (m_ObjectPools.TryGetValue(typeNamePair, out objectPool)) { return objectPool; } return null; } private IObjectPool InternalCreateObjectPool(string name, bool allowMultiSpawn, float autoReleaseInterval, int capacity, float expireTime, int priority) where T : ObjectBase { TypeNamePair typeNamePair = new TypeNamePair(typeof(T), name); if (HasObjectPool(name)) { throw new GameFrameworkException(Utility.Text.Format("Already exist object pool '{0}'.", typeNamePair)); } ObjectPool objectPool = new ObjectPool(name, allowMultiSpawn, autoReleaseInterval, capacity, expireTime, priority); m_ObjectPools.Add(typeNamePair, objectPool); m_ObjectPoolList.Add(objectPool); return objectPool; } private ObjectPoolBase InternalCreateObjectPool(Type objectType, string name, bool allowMultiSpawn, float autoReleaseInterval, int capacity, float expireTime, int priority) { if (objectType == null) { throw new GameFrameworkException("Object type is invalid."); } if (!typeof(ObjectBase).IsAssignableFrom(objectType)) { throw new GameFrameworkException(Utility.Text.Format("Object type '{0}' is invalid.", objectType.FullName)); } TypeNamePair typeNamePair = new TypeNamePair(objectType, name); if (HasObjectPool(objectType, name)) { throw new GameFrameworkException(Utility.Text.Format("Already exist object pool '{0}'.", typeNamePair)); } Type objectPoolType = typeof(ObjectPool<>).MakeGenericType(objectType); ObjectPoolBase objectPool = (ObjectPoolBase)Activator.CreateInstance(objectPoolType, name, allowMultiSpawn, autoReleaseInterval, capacity, expireTime, priority); m_ObjectPools.Add(typeNamePair, objectPool); m_ObjectPoolList.Add(objectPool); return objectPool; } private bool InternalDestroyObjectPool(TypeNamePair typeNamePair) { ObjectPoolBase objectPool = null; if (m_ObjectPools.TryGetValue(typeNamePair, out objectPool)) { objectPool.Shutdown(); m_ObjectPoolList.Remove(objectPool); return m_ObjectPools.Remove(typeNamePair); } return false; } private static int ObjectPoolComparer(ObjectPoolBase a, ObjectPoolBase b) { return a.Priority.CompareTo(b.Priority); } } }