You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			89 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
| 
											2 years ago
										 | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using UnityEngine; | ||
|  | 
 | ||
|  | namespace Game | ||
|  | { | ||
|  |     public delegate void PoolItemInitHandler<in TItem>(TItem item); | ||
|  | 
 | ||
|  |     public class ObjectPoolItemBase : MetaDataHandler | ||
|  |     { | ||
|  |         public bool IsAlive; | ||
|  | 
 | ||
|  |         public void Create() | ||
|  |         { | ||
|  |             if (IsAlive) return; | ||
|  |             IsAlive = true; | ||
|  |             OnCreate(); | ||
|  |             CreateBind(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void Destroy() | ||
|  |         { | ||
|  |             if (!IsAlive) return; | ||
|  |             IsAlive = false; | ||
|  |             OnDestroy(); | ||
|  |             ClearBind(); | ||
|  |         } | ||
|  | 
 | ||
|  |         protected virtual void OnCreate() | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |         protected virtual void OnDestroy() | ||
|  |         { | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public class ObjectPoolBase<TManager> : ManagerBase<TManager> where TManager : new() | ||
|  |     { | ||
|  |         public GameObject Root; | ||
|  |         protected Dictionary<object, List<ObjectPoolItemBase>> ObjectPool; | ||
|  | 
 | ||
|  |         public override void OnInit() | ||
|  |         { | ||
|  |             ObjectPool = new Dictionary<object, List<ObjectPoolItemBase>>(); | ||
|  |             CreateRoot(typeof(TManager).Name); | ||
|  |         } | ||
|  | 
 | ||
|  |         private void CreateRoot(string rootName) | ||
|  |         { | ||
|  |             Root = new GameObject(rootName); | ||
|  |             Object.DontDestroyOnLoad(Root); | ||
|  |         } | ||
|  | 
 | ||
|  |         protected T Create<T>(object objType, PoolItemInitHandler<T> callback) | ||
|  |             where T : ObjectPoolItemBase, new() | ||
|  |         { | ||
|  |             var pool = EnSureGetPool(objType); | ||
|  |             foreach (var obj in from obj in pool where !obj.IsAlive select obj as T) | ||
|  |             { | ||
|  |                 obj.Create(); | ||
|  |                 return obj; | ||
|  |             } | ||
|  | 
 | ||
|  |             var newObj = new T(); | ||
|  |             pool.Add(newObj); | ||
|  |             callback?.Invoke(newObj); | ||
|  |             newObj.Create(); | ||
|  |             return newObj; | ||
|  |         } | ||
|  | 
 | ||
|  |         protected void PreCreate<T>(object objType, PoolItemInitHandler<T> callback, int num) | ||
|  |             where T : ObjectPoolItemBase, new() | ||
|  |         { | ||
|  |             var pool = EnSureGetPool(objType); | ||
|  |             for (var _ = 0; _ < num; _++) | ||
|  |             { | ||
|  |                 var newObj = Create(objType, callback); | ||
|  |                 newObj.Destroy(); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         protected List<ObjectPoolItemBase> EnSureGetPool(object objType) | ||
|  |         { | ||
|  |             if (!ObjectPool.ContainsKey(objType)) ObjectPool[objType] = new List<ObjectPoolItemBase>(); | ||
|  |             return ObjectPool[objType]; | ||
|  |         } | ||
|  |     } | ||
|  | } |